admin felület különválasztva
This commit is contained in:
4
frontend_admin/.nuxt/dist/server/_nuxt/app-styles.BKebClGy.mjs
vendored
Normal file
4
frontend_admin/.nuxt/dist/server/_nuxt/app-styles.BKebClGy.mjs
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import style_0 from "./entry-styles-3.mjs-C1rWf53M.js";
|
||||
export default [
|
||||
style_0
|
||||
]
|
||||
119
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js
vendored
Normal file
119
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js
vendored
Normal file
@@ -0,0 +1,119 @@
|
||||
import { publicAssetsURL } from "#internal/nuxt/paths";
|
||||
import { defineStore } from "pinia";
|
||||
import { ref, computed } from "vue";
|
||||
import { u as useCookie } from "./cookie-CWIsZYm7.js";
|
||||
const _imports_0 = publicAssetsURL("/sf_logo.png");
|
||||
const useAuthStore = defineStore("auth", () => {
|
||||
const user = ref(null);
|
||||
const token = ref(null);
|
||||
const isLoading = ref(false);
|
||||
const error = ref(null);
|
||||
const isInitialized = ref(false);
|
||||
const isAuthenticated = computed(() => !!token.value && !!user.value);
|
||||
const isAdmin = computed(() => {
|
||||
const role = user.value?.role;
|
||||
if (!role) return false;
|
||||
const staffRoles = ["SUPERADMIN", "ADMIN", "MODERATOR", "SALES_REP", "SERVICE_MGR"];
|
||||
return staffRoles.includes(role.toUpperCase());
|
||||
});
|
||||
const userName = computed(() => {
|
||||
if (!user.value) return "";
|
||||
const { first_name, last_name } = user.value;
|
||||
if (first_name && last_name) return `${first_name} ${last_name}`;
|
||||
return first_name || last_name || user.value.email;
|
||||
});
|
||||
const userEmail = computed(() => user.value?.email ?? "");
|
||||
const userRole = computed(() => user.value?.role ?? "guest");
|
||||
async function login(email, password) {
|
||||
isLoading.value = true;
|
||||
error.value = null;
|
||||
try {
|
||||
const body = new URLSearchParams();
|
||||
body.append("username", email);
|
||||
body.append("password", password);
|
||||
const res = await $fetch("/api/v1/auth/login", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
||||
body
|
||||
});
|
||||
const tokenCookie = useCookie("access_token", {
|
||||
maxAge: 60 * 60 * 24 * 7,
|
||||
// 7 days
|
||||
path: "/",
|
||||
sameSite: "lax",
|
||||
secure: true
|
||||
});
|
||||
tokenCookie.value = res.access_token;
|
||||
token.value = res.access_token;
|
||||
await fetchUser();
|
||||
} catch (err) {
|
||||
error.value = err?.data?.detail || err?.message || "Login failed";
|
||||
throw err;
|
||||
} finally {
|
||||
isLoading.value = false;
|
||||
}
|
||||
}
|
||||
async function fetchUser() {
|
||||
const tokenCookie = useCookie("access_token");
|
||||
const currentToken = tokenCookie.value || token.value;
|
||||
if (!currentToken) return;
|
||||
try {
|
||||
const res = await $fetch("/api/v1/auth/me", {
|
||||
headers: { Authorization: `Bearer ${currentToken}` }
|
||||
});
|
||||
user.value = res;
|
||||
} catch (err) {
|
||||
if (err?.response?.status === 401) {
|
||||
logout();
|
||||
}
|
||||
throw err;
|
||||
}
|
||||
}
|
||||
function logout() {
|
||||
token.value = null;
|
||||
user.value = null;
|
||||
error.value = null;
|
||||
const tokenCookie = useCookie("access_token");
|
||||
tokenCookie.value = null;
|
||||
}
|
||||
async function init() {
|
||||
const tokenCookie = useCookie("access_token");
|
||||
if (tokenCookie.value) {
|
||||
token.value = tokenCookie.value;
|
||||
try {
|
||||
await fetchUser();
|
||||
} catch {
|
||||
logout();
|
||||
}
|
||||
}
|
||||
isInitialized.value = true;
|
||||
}
|
||||
function clearError() {
|
||||
error.value = null;
|
||||
}
|
||||
return {
|
||||
// State
|
||||
user,
|
||||
token,
|
||||
isLoading,
|
||||
error,
|
||||
isInitialized,
|
||||
// Getters
|
||||
isAuthenticated,
|
||||
isAdmin,
|
||||
userName,
|
||||
userEmail,
|
||||
userRole,
|
||||
// Actions
|
||||
login,
|
||||
fetchUser,
|
||||
logout,
|
||||
init,
|
||||
clearError
|
||||
};
|
||||
});
|
||||
export {
|
||||
_imports_0 as _,
|
||||
useAuthStore as u
|
||||
};
|
||||
//# sourceMappingURL=auth-CRAMW6e4.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-CRAMW6e4.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
30
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js
vendored
Normal file
30
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js
vendored
Normal file
@@ -0,0 +1,30 @@
|
||||
import { d as defineNuxtRouteMiddleware, n as navigateTo } from "../server.mjs";
|
||||
import { u as useCookie } from "./cookie-CWIsZYm7.js";
|
||||
import "vue";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/unctx/dist/index.mjs";
|
||||
import "/app/node_modules/h3/dist/index.mjs";
|
||||
import "pinia";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "vue-router";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "vue/server-renderer";
|
||||
import "/app/node_modules/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
const auth = defineNuxtRouteMiddleware((to, from) => {
|
||||
if (to.path === "/login") {
|
||||
return;
|
||||
}
|
||||
const tokenCookie = useCookie("access_token");
|
||||
if (!tokenCookie.value) {
|
||||
return navigateTo("/login");
|
||||
}
|
||||
});
|
||||
export {
|
||||
auth as default
|
||||
};
|
||||
//# sourceMappingURL=auth-D_CY0lMs.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth-D_CY0lMs.js","sources":["../../../../middleware/auth.ts"],"sourcesContent":["export default defineNuxtRouteMiddleware((to, from) => {\n // Skip auth check on the login page itself\n if (to.path === '/login') {\n return\n }\n\n // Check for the access_token cookie\n const tokenCookie = useCookie('access_token')\n if (!tokenCookie.value) {\n return navigateTo('/login')\n }\n\n // If the store is already initialized, check isAuthenticated\n // Otherwise, the token cookie presence is sufficient for the guard\n // The store's init() will validate the token on app mount\n})\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,MAAA,OAAe,0BAA0B,CAAC,IAAI,SAAS;AAErD,MAAI,GAAG,SAAS,UAAU;AACxB;AAAA,EACF;AAGA,QAAM,cAAc,UAAU,cAAc;AAC5C,MAAI,CAAC,YAAY,OAAO;AACtB,WAAO,WAAW,QAAQ;AAAA,EAC5B;AAKF,CAAC;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-D_CY0lMs.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"auth-D_CY0lMs.js","mappings":";;;;;;;;;;;;;;;;;AAAA,MAAA,OAAe,0BAA0B,CAAC,IAAI,SAAS;AAErD,MAAI,GAAG,SAAS,UAAU;AACxB;AAAA,EACF;AAGA,QAAM,cAAc,UAAU,cAAc;AAC5C,MAAI,CAAC,YAAY,OAAO;AACtB,WAAO,WAAW,QAAQ;AAAA,EAC5B;AAKF,CAAC;","names":[],"sources":["../../../../middleware/auth.ts"],"sourcesContent":["export default defineNuxtRouteMiddleware((to, from) => {\n // Skip auth check on the login page itself\n if (to.path === '/login') {\n return\n }\n\n // Check for the access_token cookie\n const tokenCookie = useCookie('access_token')\n if (!tokenCookie.value) {\n return navigateTo('/login')\n }\n\n // If the store is already initialized, check isAuthenticated\n // Otherwise, the token cookie presence is sufficient for the guard\n // The store's init() will validate the token on app mount\n})\n"],"version":3}
|
||||
79
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js
vendored
Normal file
79
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js
vendored
Normal file
@@ -0,0 +1,79 @@
|
||||
import { ref } from "vue";
|
||||
import { parse } from "/app/node_modules/cookie-es/dist/index.mjs";
|
||||
import { getRequestHeader, setCookie, getCookie, deleteCookie } from "/app/node_modules/h3/dist/index.mjs";
|
||||
import destr from "/app/node_modules/destr/dist/index.mjs";
|
||||
import { isEqual } from "/app/node_modules/ohash/dist/index.mjs";
|
||||
import { klona } from "/app/node_modules/klona/dist/index.mjs";
|
||||
import { a as useNuxtApp } from "../server.mjs";
|
||||
function useRequestEvent(nuxtApp) {
|
||||
nuxtApp ||= useNuxtApp();
|
||||
return nuxtApp.ssrContext?.event;
|
||||
}
|
||||
const CookieDefaults = {
|
||||
path: "/",
|
||||
watch: true,
|
||||
decode: (val) => {
|
||||
const decoded = decodeURIComponent(val);
|
||||
const parsed = destr(decoded);
|
||||
if (typeof parsed === "number" && (!Number.isFinite(parsed) || String(parsed) !== decoded)) {
|
||||
return decoded;
|
||||
}
|
||||
return parsed;
|
||||
},
|
||||
encode: (val) => encodeURIComponent(typeof val === "string" ? val : JSON.stringify(val))
|
||||
};
|
||||
function useCookie(name, _opts) {
|
||||
const opts = { ...CookieDefaults, ..._opts };
|
||||
opts.filter ??= (key) => key === name;
|
||||
const cookies = readRawCookies(opts) || {};
|
||||
let delay;
|
||||
if (opts.maxAge !== void 0) {
|
||||
delay = opts.maxAge * 1e3;
|
||||
} else if (opts.expires) {
|
||||
delay = opts.expires.getTime() - Date.now();
|
||||
}
|
||||
const hasExpired = delay !== void 0 && delay <= 0;
|
||||
const cookieValue = klona(hasExpired ? void 0 : cookies[name] ?? opts.default?.());
|
||||
const cookie = ref(cookieValue);
|
||||
{
|
||||
const nuxtApp = useNuxtApp();
|
||||
const writeFinalCookieValue = () => {
|
||||
if (opts.readonly || isEqual(cookie.value, cookies[name])) {
|
||||
return;
|
||||
}
|
||||
nuxtApp._cookies ||= {};
|
||||
if (name in nuxtApp._cookies) {
|
||||
if (isEqual(cookie.value, nuxtApp._cookies[name])) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
nuxtApp._cookies[name] = cookie.value;
|
||||
writeServerCookie(useRequestEvent(nuxtApp), name, cookie.value, opts);
|
||||
};
|
||||
const unhook = nuxtApp.hooks.hookOnce("app:rendered", writeFinalCookieValue);
|
||||
nuxtApp.hooks.hookOnce("app:error", () => {
|
||||
unhook();
|
||||
return writeFinalCookieValue();
|
||||
});
|
||||
}
|
||||
return cookie;
|
||||
}
|
||||
function readRawCookies(opts = {}) {
|
||||
{
|
||||
return parse(getRequestHeader(useRequestEvent(), "cookie") || "", opts);
|
||||
}
|
||||
}
|
||||
function writeServerCookie(event, name, value, opts = {}) {
|
||||
if (event) {
|
||||
if (value !== null && value !== void 0) {
|
||||
return setCookie(event, name, value, opts);
|
||||
}
|
||||
if (getCookie(event, name) !== void 0) {
|
||||
return deleteCookie(event, name, opts);
|
||||
}
|
||||
}
|
||||
}
|
||||
export {
|
||||
useCookie as u
|
||||
};
|
||||
//# sourceMappingURL=cookie-CWIsZYm7.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/cookie-CWIsZYm7.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
253
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js
vendored
Normal file
253
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js
vendored
Normal file
@@ -0,0 +1,253 @@
|
||||
import { _ as __nuxt_component_0 } from "./nuxt-link-DNVrgHUL.js";
|
||||
import { defineComponent, ref, computed, mergeProps, withCtx, createVNode, toDisplayString, withDirectives, vShow, openBlock, createBlock, createTextVNode, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrRenderClass, ssrRenderAttr, ssrRenderList, ssrInterpolate, ssrRenderStyle, ssrRenderComponent, ssrRenderSlot } from "vue/server-renderer";
|
||||
import { u as useAuthStore, _ as _imports_0 } from "./auth-CRAMW6e4.js";
|
||||
import { useRoute } from "vue-router";
|
||||
import { u as useRouter } from "../server.mjs";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "pinia";
|
||||
import "./cookie-CWIsZYm7.js";
|
||||
import "/app/node_modules/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/h3/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/unctx/dist/index.mjs";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "default",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const route = useRoute();
|
||||
useRouter();
|
||||
const authStore = useAuthStore();
|
||||
const sidebarOpen = ref(false);
|
||||
const sidebarCollapsed = ref(false);
|
||||
const dropdownOpen = ref(false);
|
||||
ref(null);
|
||||
const expandedGroups = ref(/* @__PURE__ */ new Set(["Központ"]));
|
||||
const userEmail = computed(() => authStore.userEmail || "admin@servicefinder.hu");
|
||||
const userInitials = computed(() => {
|
||||
const email = authStore.userEmail;
|
||||
if (!email) return "AD";
|
||||
return email.split("@")[0].split(".").map((s) => s[0]).join("").toUpperCase().slice(0, 2);
|
||||
});
|
||||
const menuGroups = [
|
||||
{
|
||||
title: "Központ",
|
||||
items: [
|
||||
{
|
||||
path: "/",
|
||||
label: "Dashboard",
|
||||
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>'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Felhasználók & Partnerek",
|
||||
items: [
|
||||
{
|
||||
label: "Garázsok",
|
||||
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>',
|
||||
children: [
|
||||
{
|
||||
path: "/garages",
|
||||
label: "Garázsok listája",
|
||||
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>'
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
label: "Felhasználók",
|
||||
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>',
|
||||
children: [
|
||||
{
|
||||
path: "/users",
|
||||
label: "Felhasználók listája",
|
||||
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>'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
title: "Rendszer",
|
||||
items: [
|
||||
{
|
||||
path: "/permissions",
|
||||
label: "Jogosultságok",
|
||||
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>'
|
||||
},
|
||||
{
|
||||
label: "Rendszernaplók",
|
||||
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>',
|
||||
children: [
|
||||
{
|
||||
path: "/logs",
|
||||
label: "Rendszernaplók",
|
||||
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>'
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
];
|
||||
const pageTitle = computed(() => {
|
||||
if (route.path === "/") return "Dashboard";
|
||||
if (route.path.startsWith("/permissions")) return "Jogosultság Kezelés";
|
||||
if (route.path.startsWith("/garages")) return "Garázsok";
|
||||
if (route.path.startsWith("/users")) return "Felhasználók";
|
||||
if (route.path.startsWith("/logs")) return "Rendszernaplók";
|
||||
return "Admin Panel";
|
||||
});
|
||||
function isActive(path) {
|
||||
if (path === "/") return route.path === "/";
|
||||
return route.path.startsWith(path);
|
||||
}
|
||||
function isGroupActive(item) {
|
||||
if (!item.children) return false;
|
||||
return item.children.some((child) => isActive(child.path));
|
||||
}
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
const _component_NuxtLink = __nuxt_component_0;
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "min-h-screen bg-slate-900 text-white flex" }, _attrs))}>`);
|
||||
if (sidebarOpen.value) {
|
||||
_push(`<div class="fixed inset-0 bg-black/50 z-20 lg:hidden"></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<aside class="${ssrRenderClass([
|
||||
"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",
|
||||
sidebarOpen.value ? "w-64 translate-x-0" : "-translate-x-full lg:translate-x-0 lg:w-20"
|
||||
])}"><div class="flex items-center h-16 px-4 border-b border-slate-700">`);
|
||||
if (sidebarOpen.value || !sidebarCollapsed.value) {
|
||||
_push(`<div class="flex items-center gap-3"><img${ssrRenderAttr("src", _imports_0)} class="h-8 w-auto" alt="SF Logo"><span class="text-lg font-bold text-white whitespace-nowrap">Admin Panel</span></div>`);
|
||||
} else {
|
||||
_push(`<div class="mx-auto"><img${ssrRenderAttr("src", _imports_0)} class="h-8 w-auto" alt="SF Logo"></div>`);
|
||||
}
|
||||
_push(`</div><button 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"><svg class="${ssrRenderClass([{ "rotate-180": sidebarCollapsed.value }, "w-5 h-5 transition-transform duration-300"])}" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M11 19l-7-7 7-7m8 14l-7-7 7-7"></path></svg></button><nav class="flex-1 px-2 py-4 space-y-2 overflow-y-auto"><!--[-->`);
|
||||
ssrRenderList(menuGroups, (group) => {
|
||||
_push(`<!--[-->`);
|
||||
if (!sidebarCollapsed.value || sidebarOpen.value) {
|
||||
_push(`<div class="px-3 py-1 text-xs font-semibold uppercase tracking-wider text-slate-500">${ssrInterpolate(group.title)}</div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<!--[-->`);
|
||||
ssrRenderList(group.items, (item) => {
|
||||
_push(`<!--[-->`);
|
||||
if (item.children) {
|
||||
_push(`<div><button class="${ssrRenderClass([isGroupActive(item) ? "bg-indigo-600/20 text-indigo-300" : "text-slate-300 hover:bg-slate-700 hover:text-white", "flex items-center w-full gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition"])}"><span class="flex-shrink-0 w-5 h-5">${item.icon ?? ""}</span><span class="flex-1 text-left whitespace-nowrap" style="${ssrRenderStyle(!sidebarCollapsed.value || sidebarOpen.value ? null : { display: "none" })}">${ssrInterpolate(item.label)}</span><svg class="${ssrRenderClass([{ "rotate-90": expandedGroups.value.has(item.label) }, "w-4 h-4 transition-transform duration-200"])}" fill="none" stroke="currentColor" viewBox="0 0 24 24" style="${ssrRenderStyle(!sidebarCollapsed.value || sidebarOpen.value ? null : { display: "none" })}"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M9 5l7 7-7 7"></path></svg></button><div class="ml-2 mt-1 space-y-1 overflow-hidden transition-all duration-200" style="${ssrRenderStyle(expandedGroups.value.has(item.label) && (!sidebarCollapsed.value || sidebarOpen.value) ? null : { display: "none" })}"><!--[-->`);
|
||||
ssrRenderList(item.children, (child) => {
|
||||
_push(ssrRenderComponent(_component_NuxtLink, {
|
||||
key: child.path,
|
||||
to: child.path,
|
||||
class: ["flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition", isActive(child.path) ? "bg-indigo-600 text-white" : "text-slate-400 hover:bg-slate-700 hover:text-white"],
|
||||
onClick: ($event) => sidebarOpen.value = false
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(`<span class="flex-shrink-0 w-4 h-4"${_scopeId}>${child.icon ?? ""}</span><span class="whitespace-nowrap"${_scopeId}>${ssrInterpolate(child.label)}</span>`);
|
||||
} else {
|
||||
return [
|
||||
createVNode("span", {
|
||||
class: "flex-shrink-0 w-4 h-4",
|
||||
innerHTML: child.icon
|
||||
}, null, 8, ["innerHTML"]),
|
||||
createVNode("span", { class: "whitespace-nowrap" }, toDisplayString(child.label), 1)
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 2
|
||||
}, _parent));
|
||||
});
|
||||
_push(`<!--]--></div></div>`);
|
||||
} else {
|
||||
_push(ssrRenderComponent(_component_NuxtLink, {
|
||||
to: item.path,
|
||||
class: ["flex items-center gap-3 px-3 py-2.5 rounded-lg text-sm font-medium transition", isActive(item.path) ? "bg-indigo-600 text-white" : "text-slate-300 hover:bg-slate-700 hover:text-white"],
|
||||
onClick: ($event) => sidebarOpen.value = false
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(`<span class="flex-shrink-0 w-5 h-5"${_scopeId}>${item.icon ?? ""}</span><span class="whitespace-nowrap" style="${ssrRenderStyle(!sidebarCollapsed.value || sidebarOpen.value ? null : { display: "none" })}"${_scopeId}>${ssrInterpolate(item.label)}</span>`);
|
||||
} else {
|
||||
return [
|
||||
createVNode("span", {
|
||||
class: "flex-shrink-0 w-5 h-5",
|
||||
innerHTML: item.icon
|
||||
}, null, 8, ["innerHTML"]),
|
||||
withDirectives(createVNode("span", { class: "whitespace-nowrap" }, toDisplayString(item.label), 513), [
|
||||
[vShow, !sidebarCollapsed.value || sidebarOpen.value]
|
||||
])
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 2
|
||||
}, _parent));
|
||||
}
|
||||
_push(`<!--]-->`);
|
||||
});
|
||||
_push(`<!--]--><!--]-->`);
|
||||
});
|
||||
_push(`<!--]--></nav><div class="p-4 border-t border-slate-700">`);
|
||||
if (!sidebarCollapsed.value || sidebarOpen.value) {
|
||||
_push(`<div class="text-xs text-slate-500"> ServiceFinder v2.0 </div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></aside><div class="flex-1 flex flex-col min-w-0"><header class="sticky top-0 z-10 bg-slate-800/95 backdrop-blur-sm border-b border-slate-700"><div class="flex items-center justify-between h-16 px-4 lg:px-6"><div class="flex items-center gap-3"><button class="lg:hidden p-2 rounded-lg text-slate-400 hover:text-white hover:bg-slate-700 transition"><svg class="w-6 h-6" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16M4 18h16"></path></svg></button><h1 class="text-lg font-semibold text-white truncate">${ssrInterpolate(pageTitle.value)}</h1></div><div class="relative"><button class="flex items-center gap-2 p-1.5 rounded-lg hover:bg-slate-700 transition"><div class="w-8 h-8 rounded-full bg-indigo-600 flex items-center justify-center text-sm font-bold text-white">${ssrInterpolate(userInitials.value)}</div><span class="hidden sm:block text-sm text-slate-300">${ssrInterpolate(userEmail.value)}</span><svg class="w-4 h-4 text-slate-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M19 9l-7 7-7-7"></path></svg></button>`);
|
||||
if (dropdownOpen.value) {
|
||||
_push(`<div class="absolute right-0 mt-2 w-56 bg-slate-800 border border-slate-700 rounded-xl shadow-xl py-1 z-50"><div class="px-4 py-3 border-b border-slate-700"><p class="text-sm font-medium text-white">${ssrInterpolate(userEmail.value)}</p><p class="text-xs text-slate-400 mt-0.5">Administrator</p></div>`);
|
||||
_push(ssrRenderComponent(_component_NuxtLink, {
|
||||
to: "/profile",
|
||||
class: "flex items-center gap-3 px-4 py-2.5 text-sm text-slate-300 hover:bg-slate-700 hover:text-white transition",
|
||||
onClick: ($event) => dropdownOpen.value = false
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(`<svg class="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"${_scopeId}><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"${_scopeId}></path></svg> Profile Settings `);
|
||||
} else {
|
||||
return [
|
||||
(openBlock(), createBlock("svg", {
|
||||
class: "w-4 h-4",
|
||||
fill: "none",
|
||||
stroke: "currentColor",
|
||||
viewBox: "0 0 24 24"
|
||||
}, [
|
||||
createVNode("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"
|
||||
})
|
||||
])),
|
||||
createTextVNode(" Profile Settings ")
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent));
|
||||
_push(`<button 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"><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 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"></path></svg> Sign Out </button></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></div></header><main class="flex-1 p-4 lg:p-6 overflow-auto">`);
|
||||
ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
|
||||
_push(`</main></div></div>`);
|
||||
};
|
||||
}
|
||||
});
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("layouts/default.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=default-DbJQlxCD.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DbJQlxCD.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"entry-styles-1.mjs-CF-ChPYj.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-CF-ChPYj.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"entry-styles-1.mjs-CF-ChPYj.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"entry-styles-2.mjs-CntxBZab.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-CntxBZab.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"entry-styles-2.mjs-CntxBZab.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
const app_vue_vue_type_style_index_0_lang = "body{margin:0;padding:0}";
|
||||
export {
|
||||
app_vue_vue_type_style_index_0_lang as default
|
||||
};
|
||||
//# sourceMappingURL=entry-styles-3.mjs-C1rWf53M.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"entry-styles-3.mjs-C1rWf53M.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-3.mjs-C1rWf53M.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"entry-styles-3.mjs-C1rWf53M.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
8
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.BhrIOCGw.mjs
vendored
Normal file
8
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.BhrIOCGw.mjs
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import style_0 from "./entry-styles-1.mjs-CF-ChPYj.js";
|
||||
import style_1 from "./entry-styles-2.mjs-CntxBZab.js";
|
||||
import style_2 from "./entry-styles-3.mjs-C1rWf53M.js";
|
||||
export default [
|
||||
style_0,
|
||||
style_1,
|
||||
style_2
|
||||
]
|
||||
93
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js
vendored
Normal file
93
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js
vendored
Normal file
@@ -0,0 +1,93 @@
|
||||
import { _ as __nuxt_component_0 } from "./nuxt-link-DNVrgHUL.js";
|
||||
import { mergeProps, withCtx, createTextVNode, toDisplayString, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate, ssrRenderComponent } from "vue/server-renderer";
|
||||
import { _ as _export_sfc } from "../server.mjs";
|
||||
import { u as useHead } from "./v3-DnDMBKvA.js";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/unctx/dist/index.mjs";
|
||||
import "/app/node_modules/h3/dist/index.mjs";
|
||||
import "pinia";
|
||||
import "vue-router";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
const _sfc_main = {
|
||||
__name: "error-404",
|
||||
__ssrInlineRender: true,
|
||||
props: {
|
||||
appName: {
|
||||
type: String,
|
||||
default: "Nuxt"
|
||||
},
|
||||
version: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
status: {
|
||||
type: Number,
|
||||
default: 404
|
||||
},
|
||||
statusText: {
|
||||
type: String,
|
||||
default: "Not Found"
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
default: "Sorry, the page you are looking for could not be found."
|
||||
},
|
||||
backHome: {
|
||||
type: String,
|
||||
default: "Go back home"
|
||||
}
|
||||
},
|
||||
setup(__props) {
|
||||
const props = __props;
|
||||
useHead({
|
||||
title: `${props.status} - ${props.statusText} | ${props.appName}`,
|
||||
script: [
|
||||
{
|
||||
innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
|
||||
}
|
||||
],
|
||||
style: [
|
||||
{
|
||||
innerHTML: `*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}h1,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`
|
||||
}
|
||||
]
|
||||
});
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
const _component_NuxtLink = __nuxt_component_0;
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black" }, _attrs))} data-v-1bd9e11a><div class="fixed left-0 right-0 spotlight z-10" data-v-1bd9e11a></div><div class="max-w-520px text-center z-20" data-v-1bd9e11a><h1 class="font-medium mb-8 sm:text-10xl text-8xl" data-v-1bd9e11a>${ssrInterpolate(__props.status)}</h1><p class="font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl" data-v-1bd9e11a>${ssrInterpolate(__props.description)}</p><div class="flex items-center justify-center w-full" data-v-1bd9e11a>`);
|
||||
_push(ssrRenderComponent(_component_NuxtLink, {
|
||||
to: "/",
|
||||
class: "cursor-pointer gradient-border px-4 py-2 sm:px-6 sm:py-3 sm:text-xl text-md"
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(`${ssrInterpolate(__props.backHome)}`);
|
||||
} else {
|
||||
return [
|
||||
createTextVNode(toDisplayString(__props.backHome), 1)
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent));
|
||||
_push(`</div></div></div>`);
|
||||
};
|
||||
}
|
||||
};
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("node_modules/nuxt/dist/app/components/error-404.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
const error404 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1bd9e11a"]]);
|
||||
export {
|
||||
error404 as default
|
||||
};
|
||||
//# sourceMappingURL=error-404-BDmq62MM.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-BDmq62MM.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
5
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
const error404_vue_vue_type_style_index_0_scoped_1bd9e11a_lang = '.spotlight[data-v-1bd9e11a]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);bottom:-30vh;filter:blur(20vh);height:40vh}.gradient-border[data-v-1bd9e11a]{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);border-radius:.5rem;position:relative}@media(prefers-color-scheme:light){.gradient-border[data-v-1bd9e11a]{background-color:#ffffff4d}.gradient-border[data-v-1bd9e11a]:before{background:linear-gradient(90deg,#e2e2e2,#e2e2e2 25%,#00dc82,#36e4da 75%,#0047e1)}}@media(prefers-color-scheme:dark){.gradient-border[data-v-1bd9e11a]{background-color:#1414144d}.gradient-border[data-v-1bd9e11a]:before{background:linear-gradient(90deg,#303030,#303030 25%,#00dc82,#36e4da 75%,#0047e1)}}.gradient-border[data-v-1bd9e11a]:before{background-size:400% auto;border-radius:.5rem;content:"";inset:0;-webkit-mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);mask:linear-gradient(#fff 0 0) content-box,linear-gradient(#fff 0 0);-webkit-mask-composite:xor;mask-composite:exclude;opacity:.5;padding:2px;position:absolute;transition:background-position .3s ease-in-out,opacity .2s ease-in-out;width:100%}.gradient-border[data-v-1bd9e11a]:hover:before{background-position:-50% 0;opacity:1}.fixed[data-v-1bd9e11a]{position:fixed}.left-0[data-v-1bd9e11a]{left:0}.right-0[data-v-1bd9e11a]{right:0}.z-10[data-v-1bd9e11a]{z-index:10}.z-20[data-v-1bd9e11a]{z-index:20}.grid[data-v-1bd9e11a]{display:grid}.mb-16[data-v-1bd9e11a]{margin-bottom:4rem}.mb-8[data-v-1bd9e11a]{margin-bottom:2rem}.max-w-520px[data-v-1bd9e11a]{max-width:520px}.min-h-screen[data-v-1bd9e11a]{min-height:100vh}.w-full[data-v-1bd9e11a]{width:100%}.flex[data-v-1bd9e11a]{display:flex}.cursor-pointer[data-v-1bd9e11a]{cursor:pointer}.place-content-center[data-v-1bd9e11a]{place-content:center}.items-center[data-v-1bd9e11a]{align-items:center}.justify-center[data-v-1bd9e11a]{justify-content:center}.overflow-hidden[data-v-1bd9e11a]{overflow:hidden}.bg-white[data-v-1bd9e11a]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-4[data-v-1bd9e11a]{padding-left:1rem;padding-right:1rem}.px-8[data-v-1bd9e11a]{padding-left:2rem;padding-right:2rem}.py-2[data-v-1bd9e11a]{padding-bottom:.5rem;padding-top:.5rem}.text-center[data-v-1bd9e11a]{text-align:center}.text-8xl[data-v-1bd9e11a]{font-size:6rem;line-height:1}.text-xl[data-v-1bd9e11a]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-1bd9e11a]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-1bd9e11a]{font-weight:300}.font-medium[data-v-1bd9e11a]{font-weight:500}.leading-tight[data-v-1bd9e11a]{line-height:1.25}.font-sans[data-v-1bd9e11a]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-1bd9e11a]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-black[data-v-1bd9e11a]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\\:text-white[data-v-1bd9e11a]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:px-0[data-v-1bd9e11a]{padding-left:0;padding-right:0}.sm\\:px-6[data-v-1bd9e11a]{padding-left:1.5rem;padding-right:1.5rem}.sm\\:py-3[data-v-1bd9e11a]{padding-bottom:.75rem;padding-top:.75rem}.sm\\:text-4xl[data-v-1bd9e11a]{font-size:2.25rem;line-height:2.5rem}.sm\\:text-xl[data-v-1bd9e11a]{font-size:1.25rem;line-height:1.75rem}}';
|
||||
export {
|
||||
error404_vue_vue_type_style_index_0_scoped_1bd9e11a_lang as default
|
||||
};
|
||||
//# sourceMappingURL=error-404-styles-1.mjs-COQ9lBg6.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"error-404-styles-1.mjs-COQ9lBg6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles-1.mjs-COQ9lBg6.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"error-404-styles-1.mjs-COQ9lBg6.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
4
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles.CiJjK6WX.mjs
vendored
Normal file
4
frontend_admin/.nuxt/dist/server/_nuxt/error-404-styles.CiJjK6WX.mjs
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import style_0 from "./error-404-styles-1.mjs-COQ9lBg6.js";
|
||||
export default [
|
||||
style_0
|
||||
]
|
||||
71
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js
vendored
Normal file
71
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
import { mergeProps, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate } from "vue/server-renderer";
|
||||
import { _ as _export_sfc } from "../server.mjs";
|
||||
import { u as useHead } from "./v3-DnDMBKvA.js";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/unctx/dist/index.mjs";
|
||||
import "/app/node_modules/h3/dist/index.mjs";
|
||||
import "pinia";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "vue-router";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
const _sfc_main = {
|
||||
__name: "error-500",
|
||||
__ssrInlineRender: true,
|
||||
props: {
|
||||
appName: {
|
||||
type: String,
|
||||
default: "Nuxt"
|
||||
},
|
||||
version: {
|
||||
type: String,
|
||||
default: ""
|
||||
},
|
||||
status: {
|
||||
type: Number,
|
||||
default: 500
|
||||
},
|
||||
statusText: {
|
||||
type: String,
|
||||
default: "Server error"
|
||||
},
|
||||
description: {
|
||||
type: String,
|
||||
default: "This page is temporarily unavailable."
|
||||
}
|
||||
},
|
||||
setup(__props) {
|
||||
const props = __props;
|
||||
useHead({
|
||||
title: `${props.status} - ${props.statusText} | ${props.appName}`,
|
||||
script: [
|
||||
{
|
||||
innerHTML: `!function(){const e=document.createElement("link").relList;if(!(e&&e.supports&&e.supports("modulepreload"))){for(const e of document.querySelectorAll('link[rel="modulepreload"]'))r(e);new MutationObserver(e=>{for(const o of e)if("childList"===o.type)for(const e of o.addedNodes)"LINK"===e.tagName&&"modulepreload"===e.rel&&r(e)}).observe(document,{childList:!0,subtree:!0})}function r(e){if(e.ep)return;e.ep=!0;const r=function(e){const r={};return e.integrity&&(r.integrity=e.integrity),e.referrerPolicy&&(r.referrerPolicy=e.referrerPolicy),"use-credentials"===e.crossOrigin?r.credentials="include":"anonymous"===e.crossOrigin?r.credentials="omit":r.credentials="same-origin",r}(e);fetch(e.href,r)}}();`
|
||||
}
|
||||
],
|
||||
style: [
|
||||
{
|
||||
innerHTML: `*,:after,:before{border-color:var(--un-default-border-color,#e5e7eb);border-style:solid;border-width:0;box-sizing:border-box}:after,:before{--un-content:""}html{line-height:1.5;-webkit-text-size-adjust:100%;font-family:ui-sans-serif,system-ui,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;font-feature-settings:normal;font-variation-settings:normal;-moz-tab-size:4;tab-size:4;-webkit-tap-highlight-color:transparent}body{line-height:inherit;margin:0}h1{font-size:inherit;font-weight:inherit}h1,p{margin:0}*,:after,:before{--un-rotate:0;--un-rotate-x:0;--un-rotate-y:0;--un-rotate-z:0;--un-scale-x:1;--un-scale-y:1;--un-scale-z:1;--un-skew-x:0;--un-skew-y:0;--un-translate-x:0;--un-translate-y:0;--un-translate-z:0;--un-pan-x: ;--un-pan-y: ;--un-pinch-zoom: ;--un-scroll-snap-strictness:proximity;--un-ordinal: ;--un-slashed-zero: ;--un-numeric-figure: ;--un-numeric-spacing: ;--un-numeric-fraction: ;--un-border-spacing-x:0;--un-border-spacing-y:0;--un-ring-offset-shadow:0 0 transparent;--un-ring-shadow:0 0 transparent;--un-shadow-inset: ;--un-shadow:0 0 transparent;--un-ring-inset: ;--un-ring-offset-width:0px;--un-ring-offset-color:#fff;--un-ring-width:0px;--un-ring-color:rgba(147,197,253,.5);--un-blur: ;--un-brightness: ;--un-contrast: ;--un-drop-shadow: ;--un-grayscale: ;--un-hue-rotate: ;--un-invert: ;--un-saturate: ;--un-sepia: ;--un-backdrop-blur: ;--un-backdrop-brightness: ;--un-backdrop-contrast: ;--un-backdrop-grayscale: ;--un-backdrop-hue-rotate: ;--un-backdrop-invert: ;--un-backdrop-opacity: ;--un-backdrop-saturate: ;--un-backdrop-sepia: }`
|
||||
}
|
||||
]
|
||||
});
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black" }, _attrs))} data-v-a01dd0ba><div class="-bottom-1/2 fixed h-1/2 left-0 right-0 spotlight" data-v-a01dd0ba></div><div class="max-w-520px text-center" data-v-a01dd0ba><h1 class="font-medium mb-8 sm:text-10xl text-8xl" data-v-a01dd0ba>${ssrInterpolate(__props.status)}</h1><p class="font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl" data-v-a01dd0ba>${ssrInterpolate(__props.description)}</p></div></div>`);
|
||||
};
|
||||
}
|
||||
};
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("node_modules/nuxt/dist/app/components/error-500.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
const error500 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a01dd0ba"]]);
|
||||
export {
|
||||
error500 as default
|
||||
};
|
||||
//# sourceMappingURL=error-500-gzzPk_-U.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-gzzPk_-U.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
5
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
const error500_vue_vue_type_style_index_0_scoped_a01dd0ba_lang = ".spotlight[data-v-a01dd0ba]{background:linear-gradient(45deg,#00dc82,#36e4da 50%,#0047e1);filter:blur(20vh)}.fixed[data-v-a01dd0ba]{position:fixed}.-bottom-1\\/2[data-v-a01dd0ba]{bottom:-50%}.left-0[data-v-a01dd0ba]{left:0}.right-0[data-v-a01dd0ba]{right:0}.grid[data-v-a01dd0ba]{display:grid}.mb-16[data-v-a01dd0ba]{margin-bottom:4rem}.mb-8[data-v-a01dd0ba]{margin-bottom:2rem}.h-1\\/2[data-v-a01dd0ba]{height:50%}.max-w-520px[data-v-a01dd0ba]{max-width:520px}.min-h-screen[data-v-a01dd0ba]{min-height:100vh}.place-content-center[data-v-a01dd0ba]{place-content:center}.overflow-hidden[data-v-a01dd0ba]{overflow:hidden}.bg-white[data-v-a01dd0ba]{--un-bg-opacity:1;background-color:rgb(255 255 255/var(--un-bg-opacity))}.px-8[data-v-a01dd0ba]{padding-left:2rem;padding-right:2rem}.text-center[data-v-a01dd0ba]{text-align:center}.text-8xl[data-v-a01dd0ba]{font-size:6rem;line-height:1}.text-xl[data-v-a01dd0ba]{font-size:1.25rem;line-height:1.75rem}.text-black[data-v-a01dd0ba]{--un-text-opacity:1;color:rgb(0 0 0/var(--un-text-opacity))}.font-light[data-v-a01dd0ba]{font-weight:300}.font-medium[data-v-a01dd0ba]{font-weight:500}.leading-tight[data-v-a01dd0ba]{line-height:1.25}.font-sans[data-v-a01dd0ba]{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.antialiased[data-v-a01dd0ba]{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@media(prefers-color-scheme:dark){.dark\\:bg-black[data-v-a01dd0ba]{--un-bg-opacity:1;background-color:rgb(0 0 0/var(--un-bg-opacity))}.dark\\:text-white[data-v-a01dd0ba]{--un-text-opacity:1;color:rgb(255 255 255/var(--un-text-opacity))}}@media(min-width:640px){.sm\\:px-0[data-v-a01dd0ba]{padding-left:0;padding-right:0}.sm\\:text-4xl[data-v-a01dd0ba]{font-size:2.25rem;line-height:2.5rem}}";
|
||||
export {
|
||||
error500_vue_vue_type_style_index_0_scoped_a01dd0ba_lang as default
|
||||
};
|
||||
//# sourceMappingURL=error-500-styles-1.mjs-C0glhSuM.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"error-500-styles-1.mjs-C0glhSuM.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles-1.mjs-C0glhSuM.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"error-500-styles-1.mjs-C0glhSuM.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
4
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles.ulHNpcF1.mjs
vendored
Normal file
4
frontend_admin/.nuxt/dist/server/_nuxt/error-500-styles.ulHNpcF1.mjs
vendored
Normal file
@@ -0,0 +1,4 @@
|
||||
import style_0 from "./error-500-styles-1.mjs-C0glhSuM.js";
|
||||
export default [
|
||||
style_0
|
||||
]
|
||||
33
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js
vendored
Normal file
33
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-92TOgIUU.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
55
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js
vendored
Normal file
55
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
import { defineComponent, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrRenderList, ssrInterpolate, ssrRenderClass } from "vue/server-renderer";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "index",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const superadminPerms = [
|
||||
{ key: "user_mgmt", label: "User Management", enabled: true },
|
||||
{ key: "billing_admin", label: "Billing Administration", enabled: true },
|
||||
{ key: "robot_config", label: "Robot Configuration", enabled: true },
|
||||
{ key: "system_logs", label: "System Logs Access", enabled: true },
|
||||
{ key: "api_keys", label: "API Key Management", enabled: false }
|
||||
];
|
||||
const garagePerms = [
|
||||
{ key: "vehicle_crud", label: "Vehicle CRUD", enabled: true },
|
||||
{ key: "service_booking", label: "Service Booking", enabled: true },
|
||||
{ key: "customer_view", label: "Customer Data View", enabled: true },
|
||||
{ key: "report_export", label: "Report Export", enabled: false },
|
||||
{ key: "bulk_import", label: "Bulk Import", enabled: false }
|
||||
];
|
||||
const packagePerms = [
|
||||
{ key: "premium_features", label: "Premium Features", enabled: true },
|
||||
{ key: "analytics", label: "Analytics Dashboard", enabled: true },
|
||||
{ key: "multi_garage", label: "Multi-Garage Support", enabled: false },
|
||||
{ key: "white_label", label: "White Label Branding", enabled: false },
|
||||
{ key: "api_access", label: "API Access", enabled: true }
|
||||
];
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
_push(`<div${ssrRenderAttrs(_attrs)}><div class="mb-8"><h1 class="text-2xl font-bold text-white">Jogosultság Kezelés</h1><p class="text-slate-400 mt-1">Permissions Management — Role-based access control matrix</p></div><div class="bg-indigo-500/10 border border-indigo-500/20 rounded-xl p-4 mb-8 flex items-start gap-3"><svg class="w-5 h-5 text-indigo-400 flex-shrink-0 mt-0.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><p class="text-sm text-indigo-300"> This is the permissions management interface. The 3D Capability Matrix UI (Superadmin, Garages, and Packages toggles) will be implemented here in the next iteration. </p></div><div class="grid grid-cols-1 lg:grid-cols-3 gap-6 mb-8"><div class="bg-slate-800 rounded-xl border border-slate-700 p-6"><div class="flex items-center gap-3 mb-4"><div class="p-2 rounded-lg bg-purple-500/10 text-purple-400"><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 12.75L11.25 15 15 9.75m-3-7.036A11.959 11.959 0 013.598 6 11.99 11.99 0 003 9.749c0 5.592 3.824 10.29 9 11.623 5.176-1.332 9-6.03 9-11.622 0-1.31-.21-2.571-.598-3.751h-.152c-3.196 0-6.1-1.248-8.25-3.285z"></path></svg></div><h2 class="text-lg font-semibold text-white">Superadmin</h2></div><p class="text-sm text-slate-400 mb-4">Full system access — user management, billing, robots, and system configuration.</p><div class="space-y-3"><!--[-->`);
|
||||
ssrRenderList(superadminPerms, (perm) => {
|
||||
_push(`<div class="flex items-center justify-between py-2 border-b border-slate-700/50 last:border-0"><span class="text-sm text-slate-300">${ssrInterpolate(perm.label)}</span><span class="${ssrRenderClass([perm.enabled ? "bg-emerald-400/10 text-emerald-400" : "bg-slate-700 text-slate-500", "text-xs px-2 py-0.5 rounded-full"])}">${ssrInterpolate(perm.enabled ? "Enabled" : "Disabled")}</span></div>`);
|
||||
});
|
||||
_push(`<!--]--></div><div class="mt-4 pt-4 border-t border-slate-700"><button class="w-full px-4 py-2 text-sm bg-purple-600 hover:bg-purple-500 text-white rounded-lg transition"> Configure Superadmin </button></div></div><div class="bg-slate-800 rounded-xl border border-slate-700 p-6"><div class="flex items-center gap-3 mb-4"><div class="p-2 rounded-lg bg-cyan-500/10 text-cyan-400"><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.25 18.75a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m3 0h6m-9 0H3.375a1.125 1.125 0 01-1.125-1.125V14.25m17.25 4.5a1.5 1.5 0 01-3 0m3 0a1.5 1.5 0 00-3 0m3 0h1.125c.621 0 1.129-.504 1.09-1.124a17.902 17.902 0 00-3.213-9.193 2.056 2.056 0 00-1.58-.86H14.25M16.5 18.75h-2.25m0-11.177v-.958c0-.568-.422-1.048-.987-1.106a48.554 48.554 0 00-10.026 0 1.106 1.106 0 00-.987 1.106v7.635m12-6.677v6.677m0 4.5v-4.5m0 0h-12"></path></svg></div><h2 class="text-lg font-semibold text-white">Garages</h2></div><p class="text-sm text-slate-400 mb-4">Garage-level access — vehicle management, service booking, customer data.</p><div class="space-y-3"><!--[-->`);
|
||||
ssrRenderList(garagePerms, (perm) => {
|
||||
_push(`<div class="flex items-center justify-between py-2 border-b border-slate-700/50 last:border-0"><span class="text-sm text-slate-300">${ssrInterpolate(perm.label)}</span><span class="${ssrRenderClass([perm.enabled ? "bg-emerald-400/10 text-emerald-400" : "bg-slate-700 text-slate-500", "text-xs px-2 py-0.5 rounded-full"])}">${ssrInterpolate(perm.enabled ? "Enabled" : "Disabled")}</span></div>`);
|
||||
});
|
||||
_push(`<!--]--></div><div class="mt-4 pt-4 border-t border-slate-700"><button class="w-full px-4 py-2 text-sm bg-cyan-600 hover:bg-cyan-500 text-white rounded-lg transition"> Configure Garages </button></div></div><div class="bg-slate-800 rounded-xl border border-slate-700 p-6"><div class="flex items-center gap-3 mb-4"><div class="p-2 rounded-lg bg-amber-500/10 text-amber-400"><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"></path></svg></div><h2 class="text-lg font-semibold text-white">Packages</h2></div><p class="text-sm text-slate-400 mb-4">Subscription package permissions — feature toggles per plan tier.</p><div class="space-y-3"><!--[-->`);
|
||||
ssrRenderList(packagePerms, (perm) => {
|
||||
_push(`<div class="flex items-center justify-between py-2 border-b border-slate-700/50 last:border-0"><span class="text-sm text-slate-300">${ssrInterpolate(perm.label)}</span><span class="${ssrRenderClass([perm.enabled ? "bg-emerald-400/10 text-emerald-400" : "bg-slate-700 text-slate-500", "text-xs px-2 py-0.5 rounded-full"])}">${ssrInterpolate(perm.enabled ? "Enabled" : "Disabled")}</span></div>`);
|
||||
});
|
||||
_push(`<!--]--></div><div class="mt-4 pt-4 border-t border-slate-700"><button class="w-full px-4 py-2 text-sm bg-amber-600 hover:bg-amber-500 text-white rounded-lg transition"> Configure Packages </button></div></div></div><div class="bg-slate-800/50 border-2 border-dashed border-slate-600 rounded-xl p-12 text-center"><svg class="w-12 h-12 mx-auto text-slate-600 mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M9 17.25v1.007a3 3 0 01-.879 2.122L7.5 21h9l-.621-.621A3 3 0 0115 18.257V17.25m6-12V15a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 15V5.25m18 0A2.25 2.25 0 0018.75 3H5.25A2.25 2.25 0 003 5.25m18 0V12a2.25 2.25 0 01-2.25 2.25H5.25A2.25 2.25 0 013 12V5.25"></path></svg><h3 class="text-lg font-semibold text-slate-400 mb-2">3D Capability Matrix</h3><p class="text-sm text-slate-500 max-w-md mx-auto"> The interactive permission matrix UI with toggles for Superadmin, Garages, and Packages will be rendered here in the next development phase. </p></div></div>`);
|
||||
};
|
||||
}
|
||||
});
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/permissions/index.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=index-nGH29Vk2.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-nGH29Vk2.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
71
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js
vendored
Normal file
71
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js
vendored
Normal file
@@ -0,0 +1,71 @@
|
||||
import { _ as __nuxt_component_0 } from "./nuxt-link-DNVrgHUL.js";
|
||||
import { defineComponent, ref, mergeProps, unref, withCtx, createTextVNode, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrRenderAttr, ssrInterpolate, ssrIncludeBooleanAttr, ssrRenderComponent } from "vue/server-renderer";
|
||||
import { u as useAuthStore, _ as _imports_0 } from "./auth-CRAMW6e4.js";
|
||||
import { u as useRouter } from "../server.mjs";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "pinia";
|
||||
import "./cookie-CWIsZYm7.js";
|
||||
import "/app/node_modules/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/h3/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/unctx/dist/index.mjs";
|
||||
import "vue-router";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "login",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const email = ref("");
|
||||
const password = ref("");
|
||||
useRouter();
|
||||
const authStore = useAuthStore();
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
const _component_NuxtLink = __nuxt_component_0;
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "min-h-screen bg-slate-900 flex items-center justify-center px-4" }, _attrs))}><div class="w-full max-w-md"><div class="text-center mb-8"><div class="flex items-center justify-center gap-3 mb-4"><img${ssrRenderAttr("src", _imports_0)} class="h-12 w-auto drop-shadow-md" alt="ServiceFinder Logo"><span class="text-3xl font-extrabold tracking-wider"><span class="text-white">SERVICE</span><span class="text-cyan-400">FINDER</span></span></div><h1 class="text-xl font-semibold text-slate-300">Staff Portal</h1><p class="text-sm text-slate-500 mt-1">Authorised personnel only</p></div><div class="bg-slate-800 rounded-xl shadow-2xl border border-slate-700 p-8">`);
|
||||
if (unref(authStore).error) {
|
||||
_push(`<div class="mb-6 p-3 rounded-lg bg-red-900/40 border border-red-700 text-red-300 text-sm">${ssrInterpolate(unref(authStore).error)}</div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<form class="space-y-5"><div><label for="email" class="block text-sm font-medium text-slate-300 mb-1.5"> Email Address </label><input id="email"${ssrRenderAttr("value", unref(email))} type="email" autocomplete="email" required placeholder="admin@example.com" class="w-full px-4 py-2.5 bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-cyan-500 focus:border-transparent transition"></div><div><label for="password" class="block text-sm font-medium text-slate-300 mb-1.5"> Password </label><input id="password"${ssrRenderAttr("value", unref(password))} type="password" autocomplete="current-password" required placeholder="••••••••" class="w-full px-4 py-2.5 bg-slate-700 border border-slate-600 rounded-lg text-white placeholder-slate-400 focus:outline-none focus:ring-2 focus:ring-cyan-500 focus:border-transparent transition"></div><button type="submit"${ssrIncludeBooleanAttr(unref(authStore).isLoading) ? " disabled" : ""} class="w-full py-2.5 px-4 bg-cyan-600 hover:bg-cyan-500 disabled:bg-cyan-800 disabled:cursor-not-allowed text-white font-semibold rounded-lg transition duration-200 flex items-center justify-center gap-2">`);
|
||||
if (unref(authStore).isLoading) {
|
||||
_push(`<svg class="animate-spin h-5 w-5 text-white" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24"><circle class="opacity-25" cx="12" cy="12" r="10" stroke="currentColor" stroke-width="4"></circle><path class="opacity-75" fill="currentColor" d="M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"></path></svg>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<span>${ssrInterpolate(unref(authStore).isLoading ? "Signing in..." : "Sign In")}</span></button></form><div class="mt-6 text-center">`);
|
||||
_push(ssrRenderComponent(_component_NuxtLink, {
|
||||
to: "/",
|
||||
class: "text-sm text-slate-500 hover:text-cyan-400 transition"
|
||||
}, {
|
||||
default: withCtx((_, _push2, _parent2, _scopeId) => {
|
||||
if (_push2) {
|
||||
_push2(` ← Back to ServiceFinder `);
|
||||
} else {
|
||||
return [
|
||||
createTextVNode(" ← Back to ServiceFinder ")
|
||||
];
|
||||
}
|
||||
}),
|
||||
_: 1
|
||||
}, _parent));
|
||||
_push(`</div></div></div></div>`);
|
||||
};
|
||||
}
|
||||
});
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/login.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=login-CLIOTi6c.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/login-CLIOTi6c.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
307
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js
vendored
Normal file
307
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js
vendored
Normal file
@@ -0,0 +1,307 @@
|
||||
import { defineComponent, shallowRef, h, resolveComponent, computed, unref } from "vue";
|
||||
import { parseQuery, hasProtocol, joinURL, isScriptProtocol, withTrailingSlash, withoutTrailingSlash } from "/app/node_modules/ufo/dist/index.mjs";
|
||||
import { u as useRouter, e as encodeRoutePath, r as resolveRouteObject, n as navigateTo, a as useNuxtApp, b as useRuntimeConfig, c as nuxtLinkDefaults } from "../server.mjs";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
const firstNonUndefined = (...args) => args.find((arg) => arg !== void 0);
|
||||
function sanitizeExternalHref(value) {
|
||||
let candidate = value.replace(/[\u0000-\u001f\s]+/g, "");
|
||||
while (candidate.toLowerCase().startsWith("view-source:")) {
|
||||
candidate = candidate.slice("view-source:".length);
|
||||
}
|
||||
const colon = candidate.indexOf(":");
|
||||
if (colon > 0 && isScriptProtocol(candidate.slice(0, colon + 1))) {
|
||||
return null;
|
||||
}
|
||||
return value;
|
||||
}
|
||||
// @__NO_SIDE_EFFECTS__
|
||||
function defineNuxtLink(options) {
|
||||
const componentName = options.componentName || "NuxtLink";
|
||||
function isHashLinkWithoutHashMode(link) {
|
||||
return typeof link === "string" && link.startsWith("#");
|
||||
}
|
||||
function resolveTrailingSlashBehavior(to, resolve, trailingSlash) {
|
||||
const effectiveTrailingSlash = trailingSlash ?? options.trailingSlash;
|
||||
if (!to || effectiveTrailingSlash !== "append" && effectiveTrailingSlash !== "remove") {
|
||||
return to;
|
||||
}
|
||||
if (typeof to === "string") {
|
||||
return applyTrailingSlashBehavior(to, effectiveTrailingSlash);
|
||||
}
|
||||
const path = "path" in to && to.path !== void 0 ? to.path : resolve(to).path;
|
||||
const resolvedPath = {
|
||||
...to,
|
||||
name: void 0,
|
||||
// named routes would otherwise always override trailing slash behavior
|
||||
path: applyTrailingSlashBehavior(path, effectiveTrailingSlash)
|
||||
};
|
||||
return resolvedPath;
|
||||
}
|
||||
function useNuxtLink(props) {
|
||||
const router = useRouter();
|
||||
const config = useRuntimeConfig();
|
||||
const hasTarget = computed(() => !!unref(props.target) && unref(props.target) !== "_self");
|
||||
const isAbsoluteUrl = computed(() => {
|
||||
const path = unref(props.to) || unref(props.href) || "";
|
||||
return typeof path === "string" && hasProtocol(path, { acceptRelative: true });
|
||||
});
|
||||
const builtinRouterLink = resolveComponent("RouterLink");
|
||||
const useBuiltinLink = builtinRouterLink && typeof builtinRouterLink !== "string" ? builtinRouterLink.useLink : void 0;
|
||||
const isExternal = computed(() => {
|
||||
if (unref(props.external)) {
|
||||
return true;
|
||||
}
|
||||
const path = unref(props.to) || unref(props.href) || "";
|
||||
if (typeof path === "object") {
|
||||
return false;
|
||||
}
|
||||
return path === "" || isAbsoluteUrl.value;
|
||||
});
|
||||
const to = computed(() => {
|
||||
const path = unref(props.to) || unref(props.href) || "";
|
||||
if (isExternal.value) {
|
||||
return path;
|
||||
}
|
||||
return resolveTrailingSlashBehavior(path, router.resolve, unref(props.trailingSlash));
|
||||
});
|
||||
const link = isExternal.value ? void 0 : useBuiltinLink?.({ ...props, to, viewTransition: unref(props.viewTransition) });
|
||||
const href = computed(() => {
|
||||
const effectiveTrailingSlash = unref(props.trailingSlash) ?? options.trailingSlash;
|
||||
if (!to.value || isAbsoluteUrl.value || isHashLinkWithoutHashMode(to.value)) {
|
||||
const raw = to.value;
|
||||
return typeof raw === "string" ? sanitizeExternalHref(raw) : raw;
|
||||
}
|
||||
if (isExternal.value) {
|
||||
const path = typeof to.value === "object" && "path" in to.value ? resolveRouteObject(to.value) : to.value;
|
||||
const href2 = typeof path === "object" ? router.resolve(path).href : path;
|
||||
const safe = typeof href2 === "string" ? sanitizeExternalHref(href2) : href2;
|
||||
return safe === null ? null : applyTrailingSlashBehavior(safe, effectiveTrailingSlash);
|
||||
}
|
||||
if (typeof to.value === "object") {
|
||||
return router.resolve(to.value)?.href ?? null;
|
||||
}
|
||||
return applyTrailingSlashBehavior(joinURL(config.app.baseURL, to.value), effectiveTrailingSlash);
|
||||
});
|
||||
return {
|
||||
to,
|
||||
hasTarget,
|
||||
isAbsoluteUrl,
|
||||
isExternal,
|
||||
//
|
||||
href,
|
||||
isActive: link?.isActive ?? computed(() => to.value === router.currentRoute.value.path),
|
||||
isExactActive: link?.isExactActive ?? computed(() => to.value === router.currentRoute.value.path),
|
||||
route: link?.route ?? computed(() => router.resolve(to.value)),
|
||||
async navigate(_e) {
|
||||
if (href.value === null) {
|
||||
return;
|
||||
}
|
||||
await navigateTo(href.value, { replace: unref(props.replace), external: isExternal.value || hasTarget.value });
|
||||
}
|
||||
};
|
||||
}
|
||||
return defineComponent({
|
||||
name: componentName,
|
||||
props: {
|
||||
// Routing
|
||||
to: {
|
||||
type: [String, Object],
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
href: {
|
||||
type: [String, Object],
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Attributes
|
||||
target: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
rel: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
noRel: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Prefetching
|
||||
prefetch: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
prefetchOn: {
|
||||
type: [String, Object],
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
noPrefetch: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Styling
|
||||
activeClass: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
exactActiveClass: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
prefetchedClass: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Vue Router's `<RouterLink>` additional props
|
||||
replace: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
ariaCurrentValue: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Edge cases handling
|
||||
external: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Slot API
|
||||
custom: {
|
||||
type: Boolean,
|
||||
default: void 0,
|
||||
required: false
|
||||
},
|
||||
// Behavior
|
||||
trailingSlash: {
|
||||
type: String,
|
||||
default: void 0,
|
||||
required: false
|
||||
}
|
||||
},
|
||||
useLink: useNuxtLink,
|
||||
setup(props, { slots }) {
|
||||
const router = useRouter();
|
||||
const { to, href, navigate, isExternal, hasTarget, isAbsoluteUrl } = useNuxtLink(props);
|
||||
shallowRef(false);
|
||||
const el = void 0;
|
||||
const elRef = void 0;
|
||||
async function prefetch(nuxtApp = useNuxtApp()) {
|
||||
{
|
||||
return;
|
||||
}
|
||||
}
|
||||
return () => {
|
||||
if (!isExternal.value && !hasTarget.value && !isHashLinkWithoutHashMode(to.value)) {
|
||||
const routerLinkProps = {
|
||||
ref: elRef,
|
||||
to: to.value,
|
||||
activeClass: props.activeClass || options.activeClass,
|
||||
exactActiveClass: props.exactActiveClass || options.exactActiveClass,
|
||||
replace: props.replace,
|
||||
ariaCurrentValue: props.ariaCurrentValue,
|
||||
custom: props.custom
|
||||
};
|
||||
if (!props.custom) {
|
||||
routerLinkProps.rel = props.rel || void 0;
|
||||
}
|
||||
return h(
|
||||
resolveComponent("RouterLink"),
|
||||
routerLinkProps,
|
||||
slots.default
|
||||
);
|
||||
}
|
||||
const target = props.target || null;
|
||||
const rel = firstNonUndefined(
|
||||
// converts `""` to `null` to prevent the attribute from being added as empty (`rel=""`)
|
||||
props.noRel ? "" : props.rel,
|
||||
options.externalRelAttribute,
|
||||
/*
|
||||
* A fallback rel of `noopener noreferrer` is applied for external links or links that open in a new tab.
|
||||
* This solves a reverse tabnapping security flaw in browsers pre-2021 as well as improving privacy.
|
||||
*/
|
||||
isAbsoluteUrl.value || hasTarget.value ? "noopener noreferrer" : ""
|
||||
) || null;
|
||||
if (props.custom) {
|
||||
if (!slots.default) {
|
||||
return null;
|
||||
}
|
||||
return slots.default({
|
||||
href: href.value,
|
||||
navigate,
|
||||
prefetch,
|
||||
get route() {
|
||||
if (!href.value) {
|
||||
return void 0;
|
||||
}
|
||||
const url = new URL(href.value, "http://localhost");
|
||||
return {
|
||||
path: url.pathname,
|
||||
fullPath: url.pathname,
|
||||
get query() {
|
||||
return parseQuery(url.search);
|
||||
},
|
||||
hash: url.hash,
|
||||
params: {},
|
||||
name: void 0,
|
||||
matched: [],
|
||||
redirectedFrom: void 0,
|
||||
meta: {},
|
||||
href: href.value
|
||||
};
|
||||
},
|
||||
rel,
|
||||
target,
|
||||
isExternal: isExternal.value || hasTarget.value,
|
||||
isActive: false,
|
||||
isExactActive: false
|
||||
});
|
||||
}
|
||||
return h("a", {
|
||||
ref: el,
|
||||
href: href.value || null,
|
||||
// converts `""` to `null` to prevent the attribute from being added as empty (`href=""`)
|
||||
rel,
|
||||
target,
|
||||
onClick: async (event) => {
|
||||
if (isExternal.value || hasTarget.value) {
|
||||
return;
|
||||
}
|
||||
event.preventDefault();
|
||||
try {
|
||||
const encodedHref = encodeRoutePath(href.value ?? "");
|
||||
return await (props.replace ? router.replace(encodedHref) : router.push(encodedHref));
|
||||
} finally {
|
||||
}
|
||||
}
|
||||
}, slots.default?.());
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
const __nuxt_component_0 = /* @__PURE__ */ defineNuxtLink(nuxtLinkDefaults);
|
||||
function applyTrailingSlashBehavior(to, trailingSlash) {
|
||||
const normalizeFn = trailingSlash === "append" ? withTrailingSlash : withoutTrailingSlash;
|
||||
const hasProtocolDifferentFromHttp = hasProtocol(to) && !to.startsWith("http");
|
||||
if (hasProtocolDifferentFromHttp) {
|
||||
return to;
|
||||
}
|
||||
return normalizeFn(to, true);
|
||||
}
|
||||
export {
|
||||
__nuxt_component_0 as _
|
||||
};
|
||||
//# sourceMappingURL=nuxt-link-DNVrgHUL.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/nuxt-link-DNVrgHUL.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
21
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js
vendored
Normal file
21
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
import { hasInjectionContext, inject } from "vue";
|
||||
import { useHead as useHead$1, headSymbol } from "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import { t as tryUseNuxtApp } from "../server.mjs";
|
||||
function injectHead(nuxtApp) {
|
||||
const nuxt = nuxtApp || tryUseNuxtApp();
|
||||
return nuxt?.ssrContext?.head || nuxt?.runWithContext(() => {
|
||||
if (hasInjectionContext()) {
|
||||
return inject(headSymbol);
|
||||
}
|
||||
});
|
||||
}
|
||||
function useHead(input, options = {}) {
|
||||
const head = injectHead(options.nuxt);
|
||||
if (head) {
|
||||
return useHead$1(input, { head, ...options });
|
||||
}
|
||||
}
|
||||
export {
|
||||
useHead as u
|
||||
};
|
||||
//# sourceMappingURL=v3-DnDMBKvA.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"v3-DnDMBKvA.js","sources":["../../../../node_modules/nuxt/dist/head/runtime/composables/v3.js"],"sourcesContent":["import { hasInjectionContext, inject } from \"vue\";\nimport {\n useHead as headCore,\n useHeadSafe as headSafe,\n headSymbol,\n useSeoMeta as seoMeta,\n useServerHead as serverHead,\n useServerHeadSafe as serverHeadSafe,\n useServerSeoMeta as serverSeoMeta\n} from \"@unhead/vue\";\nimport { tryUseNuxtApp } from \"#app/nuxt\";\nexport function injectHead(nuxtApp) {\n const nuxt = nuxtApp || tryUseNuxtApp();\n return nuxt?.ssrContext?.head || nuxt?.runWithContext(() => {\n if (hasInjectionContext()) {\n return inject(headSymbol);\n }\n });\n}\nexport function useHead(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return headCore(input, { head, ...options });\n }\n}\nexport function useHeadSafe(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return headSafe(input, { head, ...options });\n }\n}\nexport function useSeoMeta(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return seoMeta(input, { head, ...options });\n }\n}\nexport function useServerHead(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverHead(input, { head, ...options });\n }\n}\nexport function useServerHeadSafe(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverHeadSafe(input, { head, ...options });\n }\n}\nexport function useServerSeoMeta(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverSeoMeta(input, { head, ...options });\n }\n}\n"],"names":["headCore"],"mappings":";;;AAWO,SAAS,WAAW,SAAS;AAClC,QAAM,OAAO,WAAW,cAAa;AACrC,SAAO,MAAM,YAAY,QAAQ,MAAM,eAAe,MAAM;AAC1D,QAAI,oBAAmB,GAAI;AACzB,aAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AACO,SAAS,QAAQ,OAAO,UAAU,IAAI;AAC3C,QAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,MAAI,MAAM;AACR,WAAOA,UAAS,OAAO,EAAE,MAAM,GAAG,QAAO,CAAE;AAAA,EAC7C;AACF;","x_google_ignoreList":[0]}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/v3-DnDMBKvA.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"v3-DnDMBKvA.js","mappings":";;;AAWO,SAAS,WAAW,SAAS;AAClC,QAAM,OAAO,WAAW,cAAa;AACrC,SAAO,MAAM,YAAY,QAAQ,MAAM,eAAe,MAAM;AAC1D,QAAI,oBAAmB,GAAI;AACzB,aAAO,OAAO,UAAU;AAAA,IAC1B;AAAA,EACF,CAAC;AACH;AACO,SAAS,QAAQ,OAAO,UAAU,IAAI;AAC3C,QAAM,OAAO,WAAW,QAAQ,IAAI;AACpC,MAAI,MAAM;AACR,WAAOA,UAAS,OAAO,EAAE,MAAM,GAAG,QAAO,CAAE;AAAA,EAC7C;AACF;","names":["headCore"],"sources":["../../../../node_modules/nuxt/dist/head/runtime/composables/v3.js"],"sourcesContent":["import { hasInjectionContext, inject } from \"vue\";\nimport {\n useHead as headCore,\n useHeadSafe as headSafe,\n headSymbol,\n useSeoMeta as seoMeta,\n useServerHead as serverHead,\n useServerHeadSafe as serverHeadSafe,\n useServerSeoMeta as serverSeoMeta\n} from \"@unhead/vue\";\nimport { tryUseNuxtApp } from \"#app/nuxt\";\nexport function injectHead(nuxtApp) {\n const nuxt = nuxtApp || tryUseNuxtApp();\n return nuxt?.ssrContext?.head || nuxt?.runWithContext(() => {\n if (hasInjectionContext()) {\n return inject(headSymbol);\n }\n });\n}\nexport function useHead(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return headCore(input, { head, ...options });\n }\n}\nexport function useHeadSafe(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return headSafe(input, { head, ...options });\n }\n}\nexport function useSeoMeta(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return seoMeta(input, { head, ...options });\n }\n}\nexport function useServerHead(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverHead(input, { head, ...options });\n }\n}\nexport function useServerHeadSafe(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverHeadSafe(input, { head, ...options });\n }\n}\nexport function useServerSeoMeta(input, options = {}) {\n const head = injectHead(options.nuxt);\n if (head) {\n return serverSeoMeta(input, { head, ...options });\n }\n}\n"],"version":3}
|
||||
Reference in New Issue
Block a user