Files
service-finder/frontend_admin/.nuxt/dist/server/_nuxt/default-BHklGIzv.js.map.json
2026-06-30 08:56:55 +00:00

1 line
34 KiB
JSON

{"file":"default-BHklGIzv.js","mappings":"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","names":["_ssrRenderAttrs","_mergeProps","_push","_parent","_ssrRenderAttr","_ssrRenderClass","_createVNode","_ssrRenderList","_ssrRenderStyle","_ssrInterpolate","_toDisplayString","locale","_unref","_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 ease-in-out overflow-hidden',\n sidebarOpen || !sidebarCollapsed ? 'w-52' : 'w-20',\n ]\"\n >\n <!-- Logo Area -->\n <NuxtLink to=\"/\" class=\"flex items-center h-16 px-4 border-b border-slate-700 overflow-hidden hover:bg-slate-700/50 transition\">\n <div class=\"flex items-center gap-3 min-w-0\">\n <img src=\"/logo.svg\" class=\"h-8 w-auto flex-shrink-0\" alt=\"SF Logo\" />\n <div\n class=\"transition-all duration-300 ease-in-out overflow-hidden whitespace-nowrap\"\n :class=\"sidebarOpen || !sidebarCollapsed ? 'opacity-100 max-w-[200px]' : 'opacity-0 max-w-0'\"\n >\n <div class=\"text-sm font-bold text-white leading-tight\">Service Finder</div>\n <div class=\"text-[10px] font-semibold uppercase tracking-wider text-indigo-400 leading-tight\">Admin</div>\n </div>\n </div>\n </NuxtLink>\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 flex-shrink-0\"\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 overflow-x-hidden\">\n <template v-for=\"group in menuGroups\" :key=\"group.title\">\n <!-- Group Header (visible when expanded) -->\n <div\n v-show=\"sidebarOpen || !sidebarCollapsed\"\n class=\"px-3 py-1 text-xs font-semibold uppercase tracking-wider text-slate-500 whitespace-nowrap overflow-hidden\"\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\n class=\"flex-1 text-left whitespace-nowrap overflow-hidden transition-all duration-300 ease-in-out\"\n :class=\"sidebarOpen || !sidebarCollapsed ? 'opacity-100 max-w-[200px]' : 'opacity-0 max-w-0'\"\n >{{ item.label }}</span>\n <!-- Chevron -->\n <svg\n class=\"w-4 h-4 transition-all duration-300 ease-in-out flex-shrink-0\"\n :class=\"{\n 'rotate-90': expandedGroups.has(item.label),\n 'opacity-100': sidebarOpen || !sidebarCollapsed,\n 'opacity-0': sidebarCollapsed && !sidebarOpen\n }\"\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) && (sidebarOpen || !sidebarCollapsed)\"\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 overflow-hidden\">{{ 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\n class=\"whitespace-nowrap overflow-hidden transition-all duration-300 ease-in-out\"\n :class=\"sidebarOpen || !sidebarCollapsed ? 'opacity-100 max-w-[200px]' : 'opacity-0 max-w-0'\"\n >{{ 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 overflow-hidden\">\n <div\n class=\"text-xs text-slate-500 whitespace-nowrap transition-all duration-300 ease-in-out\"\n :class=\"sidebarOpen || !sidebarCollapsed ? 'opacity-100 max-w-[200px]' : 'opacity-0 max-w-0'\"\n >\n ServiceFinder v2.0\n </div>\n </div>\n </aside>\n\n <!-- Main Content Area -->\n <div\n class=\"flex-1 flex flex-col min-w-0 transition-all duration-300 ease-in-out\"\n >\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: Language Switcher + Avatar / Dropdown -->\n <div class=\"flex items-center gap-3\">\n <!-- Language Switcher (persisted to backend) -->\n <div class=\"flex items-center bg-slate-700/50 rounded-lg p-0.5\">\n <button\n v-for=\"locale in availableLocales\"\n :key=\"locale.code\"\n @click=\"switchLocale(locale.code)\"\n class=\"px-2.5 py-1 text-xs font-medium rounded-md transition\"\n :class=\"currentLocale === locale.code\n ? 'bg-indigo-600 text-white shadow-sm'\n : 'text-slate-400 hover:text-white'\"\n >\n {{ locale.code === 'hu' ? 'HU' : 'EN' }}\n </button>\n </div>\n\n <!-- 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\">{{ authStore.userRole === 'SUPERADMIN' ? 'Super Administrator' : authStore.userRole || '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 </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'\nimport { useI18n } from 'vue-i18n'\nimport { useRegionStore } from '~/stores/region'\n\nconst route = useRoute()\nconst router = useRouter()\n\nconst authStore = useAuthStore()\nconst regionStore = useRegionStore()\n\n// ── i18n / Language Switcher (persisted to backend) ──────────────\nconst { locale, locales } = useI18n()\nconst availableLocales = computed(() => locales.value as { code: string; name: string }[])\nconst currentLocale = computed(() => locale.value)\n\nfunction getAuthHeaders() {\n const tokenCookie = useCookie('access_token')\n const token = tokenCookie.value\n return token ? { Authorization: `Bearer ${token}` } : {}\n}\n\nasync function switchLocale(code: string) {\n locale.value = code\n // Persist language preference to backend\n try {\n await $fetch('/api/v1/auth/me/language', {\n method: 'PATCH',\n headers: {\n ...getAuthHeaders(),\n 'Content-Type': 'application/json',\n },\n body: { preferred_language: code },\n })\n } catch (err) {\n console.error('[Layout] Failed to persist language preference:', err)\n }\n}\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 || 'Ismeretlen Felhasználó')\nconst userInitials = computed(() => {\n const email = authStore.userEmail\n if (!email) return '??'\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 path: '/persons',\n label: 'Személyek',\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=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0zm6 3a2 2 0 11-4 0 2 2 0 014 0zM7 10a2 2 0 11-4 0 2 2 0 014 0z\" /></svg>',\n },\n ],\n },\n ],\n },\n {\n title: 'Pénzügyek',\n items: [\n {\n path: '/packages',\n label: 'Csomagok',\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=\"M20.25 7.5l-.625 10.632a2.25 2.25 0 01-2.247 2.118H6.622a2.25 2.25 0 01-2.247-2.118L3.75 7.5m8.25 3v6.75m0 0l-3-3m3 3l3-3M3.375 7.5h17.25c.621 0 1.125-.504 1.125-1.125v-1.5c0-.621-.504-1.125-1.125-1.125H3.375c-.621 0-1.125.504-1.125 1.125v1.5c0 .621.504 1.125 1.125 1.125z\" /></svg>',\n },\n ],\n },\n {\n title: 'Gamification',\n items: [\n {\n label: 'Játékmenet Beállítások',\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=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" /><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" /></svg>',\n children: [\n {\n path: '/gamification/point-rules',\n label: 'Pontszabályok',\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 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" /></svg>',\n },\n {\n path: '/gamification/levels',\n label: 'Szintek',\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=\"M13 7h8m0 0v8m0-8l-8 8-4-4-6 6\" /></svg>',\n },\n {\n path: '/gamification/badges',\n label: 'Kitüntetések',\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 12l2 2 4-4M7.835 4.697a3.42 3.42 0 001.946-.806 3.42 3.42 0 014.438 0 3.42 3.42 0 001.946.806 3.42 3.42 0 013.138 3.138 3.42 3.42 0 00.806 1.946 3.42 3.42 0 010 4.438 3.42 3.42 0 00-.806 1.946 3.42 3.42 0 01-3.138 3.138 3.42 3.42 0 00-1.946.806 3.42 3.42 0 01-4.438 0 3.42 3.42 0 00-1.946-.806 3.42 3.42 0 01-3.138-3.138 3.42 3.42 0 00-.806-1.946 3.42 3.42 0 010-4.438 3.42 3.42 0 00.806-1.946 3.42 3.42 0 013.138-3.138z\" /></svg>',\n },\n ],\n },\n {\n label: 'Események & Szezonok',\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=\"M8 7V3m8 4V3m-9 8h10M5 21h14a2 2 0 002-2V7a2 2 0 00-2-2H5a2 2 0 00-2 2v12a2 2 0 002 2z\" /></svg>',\n children: [\n {\n path: '/gamification/seasons',\n label: 'Szezonok',\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 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\" /></svg>',\n },\n {\n path: '/gamification/competitions',\n label: 'Versenyek',\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=\"M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 100 4 2 2 0 000-4z\" /></svg>',\n },\n ],\n },\n {\n label: 'Felhasználói Adatok',\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=\"M17 20h5v-2a3 3 0 00-5.356-1.857M17 20H7m10 0v-2c0-.656-.126-1.283-.356-1.857M7 20H2v-2a3 3 0 015.356-1.857M7 20v-2c0-.656.126-1.283.356-1.857m0 0a5.002 5.002 0 019.288 0M15 7a3 3 0 11-6 0 3 3 0 016 0z\" /></svg>',\n children: [\n {\n path: '/gamification/users',\n label: 'Statisztiká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 19v-6a2 2 0 00-2-2H5a2 2 0 00-2 2v6a2 2 0 002 2h2a2 2 0 002-2zm0 0V9a2 2 0 012-2h2a2 2 0 012 2v10m-6 0a2 2 0 002 2h2a2 2 0 002-2m0 0V5a2 2 0 012-2h2a2 2 0 012 2v14a2 2 0 01-2 2h-2a2 2 0 01-2-2z\" /></svg>',\n },\n {\n path: '/gamification/leaderboard',\n label: 'Ranglista',\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 12l2 2 4-4m5.618-4.016A11.955 11.955 0 0112 2.944a11.955 11.955 0 01-8.618 3.04A12.02 12.02 0 003 9c0 5.591 3.824 10.29 9 11.622 5.176-1.332 9-6.03 9-11.622 0-1.042-.133-2.052-.382-3.016z\" /></svg>',\n },\n {\n path: '/gamification/ledger',\n label: 'Pontnapló',\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 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-3 7h3m-3 4h3m-6-4h.01M9 16h.01\" /></svg>',\n },\n ],\n },\n {\n path: '/gamification',\n label: 'Gamification HQ',\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=\"M11.049 2.927c.3-.921 1.603-.921 1.902 0l1.519 4.674a1 1 0 00.95.69h4.915c.969 0 1.371 1.24.588 1.81l-3.976 2.888a1 1 0 00-.363 1.118l1.518 4.674c.3.922-.755 1.688-1.538 1.118l-3.976-2.888a1 1 0 00-1.176 0l-3.976 2.888c-.783.57-1.838-.197-1.538-1.118l1.518-4.674a1 1 0 00-.363-1.118l-3.976-2.888c-.784-.57-.38-1.81.588-1.81h4.914a1 1 0 00.951-.69l1.519-4.674z\" /></svg>',\n },\n {\n path: '/gamification/config',\n label: 'Rendszer Konfig',\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=\"M10.325 4.317c.426-1.756 2.924-1.756 3.35 0a1.724 1.724 0 002.573 1.066c1.543-.94 3.31.826 2.37 2.37a1.724 1.724 0 001.066 2.573c1.756.426 1.756 2.924 0 3.35a1.724 1.724 0 00-1.066 2.573c.94 1.543-.826 3.31-2.37 2.37a1.724 1.724 0 00-2.573 1.066c-.426 1.756-2.924 1.756-3.35 0a1.724 1.724 0 00-2.573-1.066c-1.543.94-3.31-.826-2.37-2.37a1.724 1.724 0 00-1.066-2.573c-1.756-.426-1.756-2.924 0-3.35a1.724 1.724 0 001.066-2.573c-.94-1.543.826-3.31 2.37-2.37.996.608 2.296.07 2.572-1.065z\" /><path stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M15 12a3 3 0 11-6 0 3 3 0 016 0z\" /></svg>',\n },\n {\n path: '/gamification/parameters',\n label: 'Rendszerparaméterek',\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 6V4m0 2a2 2 0 100 4m0-4a2 2 0 110 4m-6 8a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4m6 6v10m6-2a2 2 0 100-4m0 4a2 2 0 110-4m0 4v2m0-6V4\" /></svg>',\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: '/', /* P0 HOTFIX: placeholder until /logs page is built */\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('/persons')) return 'Személyek'\n if (route.path.startsWith('/users')) return 'Felhasználók'\n if (route.path.startsWith('/logs')) return 'Rendszernaplók'\n if (route.path.startsWith('/packages')) return 'Csomagok'\n if (route.path.startsWith('/gamification')) {\n if (route.path === '/gamification') return 'Gamification HQ'\n if (route.path === '/gamification/point-rules') return 'Pontszabályok'\n if (route.path === '/gamification/levels') return 'Szintek'\n if (route.path === '/gamification/badges') return 'Kitüntetések'\n if (route.path === '/gamification/seasons') return 'Szezonok'\n if (route.path === '/gamification/competitions') return 'Versenyek'\n if (route.path === '/gamification/users') return 'Gamification Felhasználók'\n if (route.path.startsWith('/gamification/users/')) return 'Felhasználó Gamification'\n if (route.path === '/gamification/leaderboard') return 'Ranglista'\n if (route.path === '/gamification/config') return 'Rendszer Konfig'\n if (route.path === '/gamification/parameters') return 'Rendszerparaméterek'\n if (route.path === '/gamification/ledger') return 'Pontnapló'\n return 'Gamification'\n }\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 // Initialize region store and set active region from user profile\n regionStore.fetchRegions().then(() => {\n if (authStore.user?.region_code) {\n regionStore.setActiveRegion(authStore.user.region_code)\n }\n })\n})\n\nonUnmounted(() => {\n document.removeEventListener('click', handleClickOutside)\n})\n</script>\n"],"version":3}