Files
service-finder/frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js.map.json
2026-06-24 11:29:45 +00:00

1 line
19 KiB
JSON

{"file":"default-DbJQlxCD.js","mappings":"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","names":["_ssrRenderAttrs","_mergeProps","_ssrRenderAttr","_ssrRenderList","_ssrInterpolate","_ssrRenderClass","_ssrRenderStyle","_push","_parent","_createVNode","_toDisplayString","_withDirectives","_vShow","_createBlock"],"sources":["../../../../layouts/default.vue"],"sourcesContent":["<template>\n <div class=\"min-h-screen bg-slate-900 text-white flex\">\n <!-- Sidebar Overlay (mobile) -->\n <div\n v-if=\"sidebarOpen\"\n class=\"fixed inset-0 bg-black/50 z-20 lg:hidden\"\n @click=\"sidebarOpen = false\"\n />\n\n <!-- Sidebar -->\n <aside\n :class=\"[\n 'fixed lg:static inset-y-0 left-0 z-30 flex flex-col bg-slate-800 border-r border-slate-700 transition-all duration-300',\n sidebarOpen ? 'w-64 translate-x-0' : '-translate-x-full lg:translate-x-0 lg:w-20',\n ]\"\n >\n <!-- Logo Area -->\n <div class=\"flex items-center h-16 px-4 border-b border-slate-700\">\n <div v-if=\"sidebarOpen || !sidebarCollapsed\" class=\"flex items-center gap-3\">\n <img src=\"/sf_logo.png\" class=\"h-8 w-auto\" alt=\"SF Logo\" />\n <span class=\"text-lg font-bold text-white whitespace-nowrap\">Admin Panel</span>\n </div>\n <div v-else class=\"mx-auto\">\n <img src=\"/sf_logo.png\" class=\"h-8 w-auto\" alt=\"SF Logo\" />\n </div>\n </div>\n\n <!-- Collapse Toggle (desktop) -->\n <button\n class=\"hidden lg:flex items-center justify-center h-10 mx-2 mt-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-700 transition\"\n @click=\"sidebarCollapsed = !sidebarCollapsed\"\n >\n <svg\n class=\"w-5 h-5 transition-transform duration-300\"\n :class=\"{ 'rotate-180': sidebarCollapsed }\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M11 19l-7-7 7-7m8 14l-7-7 7-7\" />\n </svg>\n </button>\n\n <!-- Navigation -->\n <nav class=\"flex-1 px-2 py-4 space-y-2 overflow-y-auto\">\n <template v-for=\"group in menuGroups\" :key=\"group.title\">\n <!-- Group Header (visible when expanded) -->\n <div\n v-if=\"!sidebarCollapsed || sidebarOpen\"\n class=\"px-3 py-1 text-xs font-semibold uppercase tracking-wider text-slate-500\"\n >\n {{ group.title }}\n </div>\n\n <!-- Menu Items -->\n <template v-for=\"item in group.items\" :key=\"item.label\">\n <!-- Item with submenu -->\n <div v-if=\"item.children\">\n <button\n class=\"flex items-center w-full gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition\"\n :class=\"isGroupActive(item) ? 'bg-indigo-600/20 text-indigo-300' : 'text-slate-300 hover:bg-slate-700 hover:text-white'\"\n @click=\"toggleGroup(item)\"\n >\n <span class=\"flex-shrink-0 w-5 h-5\" v-html=\"item.icon\" />\n <span v-show=\"!sidebarCollapsed || sidebarOpen\" class=\"flex-1 text-left whitespace-nowrap\">{{ item.label }}</span>\n <!-- Chevron -->\n <svg\n v-show=\"!sidebarCollapsed || sidebarOpen\"\n class=\"w-4 h-4 transition-transform duration-200\"\n :class=\"{ 'rotate-90': expandedGroups.has(item.label) }\"\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n <!-- Submenu -->\n <div\n v-show=\"expandedGroups.has(item.label) && (!sidebarCollapsed || sidebarOpen)\"\n class=\"ml-2 mt-1 space-y-1 overflow-hidden transition-all duration-200\"\n >\n <NuxtLink\n v-for=\"child in item.children\"\n :key=\"child.path\"\n :to=\"child.path\"\n class=\"flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition\"\n :class=\"isActive(child.path) ? 'bg-indigo-600 text-white' : 'text-slate-400 hover:bg-slate-700 hover:text-white'\"\n @click=\"sidebarOpen = false\"\n >\n <span class=\"flex-shrink-0 w-4 h-4\" v-html=\"child.icon\" />\n <span class=\"whitespace-nowrap\">{{ child.label }}</span>\n </NuxtLink>\n </div>\n </div>\n\n <!-- Plain link item -->\n <NuxtLink\n v-else\n :to=\"item.path\"\n class=\"flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition\"\n :class=\"isActive(item.path) ? 'bg-indigo-600 text-white' : 'text-slate-300 hover:bg-slate-700 hover:text-white'\"\n @click=\"sidebarOpen = false\"\n >\n <span class=\"flex-shrink-0 w-5 h-5\" v-html=\"item.icon\" />\n <span v-show=\"!sidebarCollapsed || sidebarOpen\" class=\"whitespace-nowrap\">{{ item.label }}</span>\n </NuxtLink>\n </template>\n </template>\n </nav>\n\n <!-- Sidebar Footer -->\n <div class=\"p-4 border-t border-slate-700\">\n <div v-if=\"!sidebarCollapsed || sidebarOpen\" class=\"text-xs text-slate-500\">\n ServiceFinder v2.0\n </div>\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div class=\"flex-1 flex flex-col min-w-0\">\n <!-- Topbar -->\n <header class=\"sticky top-0 z-10 bg-slate-800/95 backdrop-blur-sm border-b border-slate-700\">\n <div class=\"flex items-center justify-between h-16 px-4 lg:px-6\">\n <!-- Left: Hamburger + Page Title -->\n <div class=\"flex items-center gap-3\">\n <button\n class=\"lg:hidden p-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-700 transition\"\n @click=\"sidebarOpen = true\"\n >\n <svg class=\"w-6 h-6\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\" />\n </svg>\n </button>\n <h1 class=\"text-lg font-semibold text-white truncate\">{{ pageTitle }}</h1>\n </div>\n\n <!-- Right: Avatar / Dropdown -->\n <div class=\"relative\" ref=\"dropdownRef\">\n <button\n class=\"flex items-center gap-2 p-1.5 rounded-lg hover:bg-slate-700 transition\"\n @click=\"dropdownOpen = !dropdownOpen\"\n >\n <div class=\"w-8 h-8 rounded-full bg-indigo-600 flex items-center justify-center text-sm font-bold text-white\">\n {{ userInitials }}\n </div>\n <span class=\"hidden sm:block text-sm text-slate-300\">{{ userEmail }}</span>\n <svg class=\"w-4 h-4 text-slate-400\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n <!-- Dropdown Menu -->\n <div\n v-if=\"dropdownOpen\"\n class=\"absolute right-0 mt-2 w-56 bg-slate-800 border border-slate-700 rounded-xl shadow-xl py-1 z-50\"\n >\n <div class=\"px-4 py-3 border-b border-slate-700\">\n <p class=\"text-sm font-medium text-white\">{{ userEmail }}</p>\n <p class=\"text-xs text-slate-400 mt-0.5\">Administrator</p>\n </div>\n <NuxtLink\n to=\"/profile\"\n class=\"flex items-center gap-3 px-4 py-2.5 text-sm text-slate-300 hover:bg-slate-700 hover:text-white transition\"\n @click=\"dropdownOpen = false\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M16 7a4 4 0 11-8 0 4 4 0 018 0zM12 14a7 7 0 00-7 7h14a7 7 0 00-7-7z\" />\n </svg>\n Profile Settings\n </NuxtLink>\n <button\n class=\"flex items-center gap-3 w-full px-4 py-2.5 text-sm text-red-400 hover:bg-slate-700 hover:text-red-300 transition\"\n @click=\"handleLogout\"\n >\n <svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\">\n <path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M17 16l4-4m0 0l-4-4m4 4H7m6 4v1a3 3 0 01-3 3H6a3 3 0 01-3-3V7a3 3 0 013-3h4a3 3 0 013 3v1\" />\n </svg>\n Sign Out\n </button>\n </div>\n </div>\n </div>\n </header>\n\n <!-- Page Content -->\n <main class=\"flex-1 p-4 lg:p-6 overflow-auto\">\n <slot />\n </main>\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, onUnmounted } from 'vue'\nimport { useRoute } from 'vue-router'\n\nconst route = useRoute()\nconst router = useRouter()\n\nconst authStore = useAuthStore()\n\n// Sidebar state\nconst sidebarOpen = ref(false)\nconst sidebarCollapsed = ref(false)\n\n// Dropdown state\nconst dropdownOpen = ref(false)\nconst dropdownRef = ref<HTMLElement | null>(null)\n\n// Expanded submenu groups\nconst expandedGroups = ref<Set<string>>(new Set(['Központ']))\n\n// User info from auth store\nconst userEmail = computed(() => authStore.userEmail || 'admin@servicefinder.hu')\nconst userInitials = computed(() => {\n const email = authStore.userEmail\n if (!email) return 'AD'\n return email\n .split('@')[0]\n .split('.')\n .map(s => s[0])\n .join('')\n .toUpperCase()\n .slice(0, 2)\n})\n\n// --- Menu Group Definitions ---\ninterface MenuChild {\n path: string\n label: string\n icon: string\n}\n\ninterface MenuItem {\n label: string\n path?: string\n icon: string\n children?: MenuChild[]\n}\n\ninterface MenuGroup {\n title: string\n items: MenuItem[]\n}\n\nconst menuGroups: MenuGroup[] = [\n {\n title: 'Központ',\n items: [\n {\n path: '/',\n label: 'Dashboard',\n icon: '<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a1 1 0 011 1v4a1 1 0 001 1m-6 0h6\" /></svg>',\n },\n ],\n },\n {\n title: 'Felhasználók & Partnerek',\n items: [\n {\n label: 'Garázsok',\n icon: '<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M19 21V5a2 2 0 00-2-2H7a2 2 0 00-2 2v16m14 0h2m-2 0h-5m-9 0H3m2 0h5M9 7h1m-1 4h1m4-4h1m-1 4h1m-5 10v-5a1 1 0 011-1h2a1 1 0 011 1v5m-4 0h4\" /></svg>',\n children: [\n {\n path: '/garages',\n label: 'Garázsok listája',\n icon: '<svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M4 6h16M4 12h16M4 18h16\" /></svg>',\n },\n ],\n },\n {\n label: 'Felhasználók',\n icon: '<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z\" /></svg>',\n children: [\n {\n path: '/users',\n label: 'Felhasználók listája',\n icon: '<svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 4.354a4 4 0 110 5.292M15 21H3v-1a6 6 0 0112 0v1zm0 0h6v-1a6 6 0 00-9-5.197m13.5-9a2.5 2.5 0 11-5 0 2.5 2.5 0 015 0z\" /></svg>',\n },\n ],\n },\n ],\n },\n {\n title: 'Rendszer',\n items: [\n {\n path: '/permissions',\n label: 'Jogosultságok',\n icon: '<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z\" /></svg>',\n },\n {\n label: 'Rendszernaplók',\n icon: '<svg class=\"w-5 h-5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" /></svg>',\n children: [\n {\n path: '/logs',\n label: 'Rendszernaplók',\n icon: '<svg class=\"w-4 h-4\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M9 12h6m-6 4h6m2 5H7a2 2 0 01-2-2V5a2 2 0 012-2h5.586a1 1 0 01.707.293l5.414 5.414a1 1 0 01.293.707V19a2 2 0 01-2 2z\" /></svg>',\n },\n ],\n },\n ],\n },\n]\n\n// Page title based on route\nconst pageTitle = computed(() => {\n if (route.path === '/') return 'Dashboard'\n if (route.path.startsWith('/permissions')) return 'Jogosultság Kezelés'\n if (route.path.startsWith('/garages')) return 'Garázsok'\n if (route.path.startsWith('/users')) return 'Felhasználók'\n if (route.path.startsWith('/logs')) return 'Rendszernaplók'\n return 'Admin Panel'\n})\n\nfunction isActive(path: string) {\n if (path === '/') return route.path === '/'\n return route.path.startsWith(path)\n}\n\nfunction isGroupActive(item: MenuItem): boolean {\n if (!item.children) return false\n return item.children.some(child => isActive(child.path))\n}\n\nfunction toggleGroup(item: MenuItem) {\n if (expandedGroups.value.has(item.label)) {\n expandedGroups.value.delete(item.label)\n } else {\n expandedGroups.value.add(item.label)\n }\n}\n\nfunction handleLogout() {\n authStore.logout()\n dropdownOpen.value = false\n router.push('/login')\n}\n\n// Close dropdown on outside click\nfunction handleClickOutside(e: MouseEvent) {\n if (dropdownRef.value && !dropdownRef.value.contains(e.target as Node)) {\n dropdownOpen.value = false\n }\n}\n\nonMounted(() => {\n document.addEventListener('click', handleClickOutside)\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n"],"version":3}