jogosultsági szintek RBAC beállítva tesztelve
This commit is contained in:
@@ -2254,13 +2254,20 @@ async function getLocaleMessagesMerged(locale, loaders = []) {
|
||||
|
||||
var permissions$1 = {
|
||||
title: "Jogosultság Kezelés",
|
||||
subtitle: "Permissions Management — Role-based access control & subscription feature flags",
|
||||
subtitle: "Jogosultsági Mátrix — Szerepkör alapú hozzáférés-vezérlés",
|
||||
loading: "Jogosultságok betöltése...",
|
||||
error_title: "Nem sikerült betölteni a jogosultságokat",
|
||||
retry: "Újra",
|
||||
save_changes: "Változtatások Mentése",
|
||||
discard: "Elvetés",
|
||||
modified_count: "{count} módosítás",
|
||||
domain_filter: "Tartomány Szűrő (Sorok)",
|
||||
role_filter: "Szerepkör Szűrő (Oszlopok)",
|
||||
select_all: "Összes kiválasztása",
|
||||
deselect_all: "Összes elrejtése",
|
||||
all_domains: "Minden",
|
||||
permission: "Engedély",
|
||||
no_permissions: "Nincsenek engedélyek ebben a tartományban.",
|
||||
current_tier: "Aktuális Csomag",
|
||||
expires: "Lejárat",
|
||||
superadmin: "Superadmin",
|
||||
@@ -2271,19 +2278,7 @@ var permissions$1 = {
|
||||
feature_flags_desc: "Előfizetési funkciók — a jelenlegi csomagod alapján ({tier}).",
|
||||
rbac_title: "RBAC Jogosultsági Mátrix",
|
||||
rbac_desc: "Szerepkör alapú hozzáférés-vezérlés — mely szerepkörök mely admin műveleteket végezhetik.",
|
||||
action: "Művelet",
|
||||
perms: {
|
||||
user_mgmt: "Felhasználókezelés",
|
||||
billing_admin: "Számlázási Adminisztráció",
|
||||
robot_config: "Robot Konfiguráció",
|
||||
system_logs: "Rendszernaplók Elérése",
|
||||
api_keys: "API Kulcs Kezelés",
|
||||
vehicle_crud: "Jármű CRUD",
|
||||
service_booking: "Szervizfoglalás",
|
||||
customer_view: "Ügyféladatok Megtekintése",
|
||||
report_export: "Jelentés Exportálás",
|
||||
bulk_import: "Tömeges Import"
|
||||
}
|
||||
action: "Művelet"
|
||||
};
|
||||
var packages$1 = {
|
||||
title: "Csomagok Kezelése",
|
||||
@@ -2389,7 +2384,57 @@ var garages$1 = {
|
||||
cancel: "Mégse",
|
||||
save: "Mentés",
|
||||
saving: "Mentés...",
|
||||
subscription_updated: "előfizetése sikeresen frissítve!"
|
||||
subscription_updated: "előfizetése sikeresen frissítve!",
|
||||
view_details: "Részletek",
|
||||
indefinite: "Határozatlan",
|
||||
details: {
|
||||
loading: "Garázs adatainak betöltése...",
|
||||
retry: "Újra",
|
||||
back: "Vissza a garázsokhoz",
|
||||
company_info: "Cég adatok",
|
||||
company_name: "Cégnév",
|
||||
display_name: "Megjelenítési név",
|
||||
org_type: "Szervezet típusa",
|
||||
tax_number: "Adószám",
|
||||
reg_number: "Cégjegyzékszám",
|
||||
created_at: "Létrehozva",
|
||||
address: "Cím",
|
||||
subscription_info: "Előfizetés státusza",
|
||||
tier_name: "Csomag",
|
||||
tier_level: "Szint",
|
||||
level_n: "{n}. szint",
|
||||
expires_at: "Lejárat",
|
||||
asset_limit: "Járműkorlát",
|
||||
vehicles: "jármű",
|
||||
no_subscription: "Nincs aktív előfizetés",
|
||||
contact_info: "Elérhetőség",
|
||||
contact_name: "Kapcsolattartó neve",
|
||||
contact_role: "Szerepkör",
|
||||
contact_department: "Osztály",
|
||||
contact_phone: "Telefonszám",
|
||||
no_contact: "Nincs elsődleges kapcsolattartó",
|
||||
coming_soon: "Ez a funkció hamarosan elérhető lesz..."
|
||||
},
|
||||
employees: {
|
||||
title: "Dolgozók",
|
||||
total_count: "Összesen {count} fő",
|
||||
name: "Név",
|
||||
email_phone: "E-mail / Telefon",
|
||||
role: "Szerepkör",
|
||||
status: "Státusz",
|
||||
actions: "Műveletek",
|
||||
edit_role: "Szerepkör szerkesztése",
|
||||
remove: "Eltávolítás",
|
||||
no_employees: "Még nincsenek tagok ehhez a garázshoz.",
|
||||
edit_role_title: "Tag szerepkörének szerkesztése",
|
||||
cancel: "Mégse",
|
||||
save: "Mentés",
|
||||
status_active: "Aktív",
|
||||
status_inactive: "Inaktív",
|
||||
remove_title: "Tag eltávolítása",
|
||||
remove_confirm: "Biztosan eltávolítod {name} tagot a garázsból?",
|
||||
remove_btn: "Eltávolítás"
|
||||
}
|
||||
};
|
||||
const locale_hu_46json_ee06c965 = {
|
||||
permissions: permissions$1,
|
||||
@@ -2399,55 +2444,50 @@ const locale_hu_46json_ee06c965 = {
|
||||
|
||||
var permissions = {
|
||||
title: "Permissions Management",
|
||||
subtitle: "Permissions Management — Role-based access control & subscription feature flags",
|
||||
loading: "Loading permissions data...",
|
||||
subtitle: "Permission Matrix — Role-based access control",
|
||||
loading: "Loading permissions...",
|
||||
error_title: "Failed to load permissions",
|
||||
retry: "Retry",
|
||||
save_changes: "Save Changes",
|
||||
discard: "Discard",
|
||||
modified_count: "{count} modification(s)",
|
||||
current_tier: "Current Tier",
|
||||
modified_count: "{count} changes",
|
||||
domain_filter: "Domain Filter (Rows)",
|
||||
role_filter: "Role Filter (Columns)",
|
||||
select_all: "Select All",
|
||||
deselect_all: "Deselect All",
|
||||
all_domains: "All",
|
||||
permission: "Permission",
|
||||
no_permissions: "No permissions in this domain.",
|
||||
current_tier: "Current Package",
|
||||
expires: "Expires",
|
||||
superadmin: "Superadmin",
|
||||
superadmin_desc: "Full system access — user management, billing, robots, and system configuration.",
|
||||
superadmin_desc: "Full system access — users, billing, robots and system configuration.",
|
||||
garages: "Garages",
|
||||
garages_desc: "Garage-level access — vehicle management, service booking, customer data.",
|
||||
feature_flags: "Feature Flags",
|
||||
feature_flags_desc: "Subscription feature toggles — resolved from your current tier ({tier}).",
|
||||
feature_flags_desc: "Subscription features — based on your current plan ({tier}).",
|
||||
rbac_title: "RBAC Permission Matrix",
|
||||
rbac_desc: "Role-based access control — which roles can perform which admin actions.",
|
||||
action: "Action",
|
||||
perms: {
|
||||
user_mgmt: "User Management",
|
||||
billing_admin: "Billing Administration",
|
||||
robot_config: "Robot Configuration",
|
||||
system_logs: "System Logs Access",
|
||||
api_keys: "API Key Management",
|
||||
vehicle_crud: "Vehicle CRUD",
|
||||
service_booking: "Service Booking",
|
||||
customer_view: "Customer Data View",
|
||||
report_export: "Report Export",
|
||||
bulk_import: "Bulk Import"
|
||||
}
|
||||
action: "Action"
|
||||
};
|
||||
var packages = {
|
||||
title: "Package Management",
|
||||
subtitle: "Manage subscription packages and feature flags — Free, Premium, Enterprise",
|
||||
subtitle: "Manage subscription packages and features — Free, Premium, Enterprise",
|
||||
loading: "Loading packages...",
|
||||
retry: "Retry",
|
||||
create_new: "Create Package",
|
||||
create_new: "New Package",
|
||||
no_packages: "No packages yet",
|
||||
no_packages_desc: "Create your first subscription package to get started.",
|
||||
create_first: "Create First Package",
|
||||
popular: "Popular",
|
||||
fallback_badge: "Fallback",
|
||||
trial_badge: "Trial",
|
||||
month: "month",
|
||||
month: "mo",
|
||||
feature_flags: "Available Features",
|
||||
edit: "Edit",
|
||||
duplicate: "Duplicate",
|
||||
"delete": "Delete",
|
||||
set_as_default: "Set as default",
|
||||
set_as_default: "Set as Default",
|
||||
set_as_default_success: "set as default package!",
|
||||
edit_title: "Edit Package",
|
||||
create_title: "Create Package",
|
||||
@@ -2462,7 +2502,7 @@ var packages = {
|
||||
max_vehicles: "Max Vehicles",
|
||||
max_garages: "Max Garages",
|
||||
monthly_credits: "Monthly Credits",
|
||||
tier_level: "Tier Level",
|
||||
tier_level: "Level",
|
||||
form_name: "System Name",
|
||||
form_name_placeholder: "e.g. premium_2024",
|
||||
form_display_name: "Display Name",
|
||||
@@ -2471,30 +2511,30 @@ var packages = {
|
||||
type_private: "Private",
|
||||
type_corporate: "Corporate",
|
||||
form_tier_level: "Tier Level",
|
||||
form_tier_level_hint: "Higher number = more features & higher rank",
|
||||
form_tier_level_hint: "Higher number = more features and higher rank",
|
||||
form_monthly_price: "Monthly Price",
|
||||
form_yearly_price: "Yearly Price",
|
||||
form_currency: "Currency",
|
||||
form_subtitle: "Subtitle / Description",
|
||||
form_subtitle_placeholder: "e.g. Best for small businesses",
|
||||
form_subtitle_placeholder: "e.g. Ideal for small businesses",
|
||||
form_badge: "Badge Text",
|
||||
form_badge_placeholder: "e.g. Most Popular",
|
||||
form_is_custom: "Custom Package (not publicly listed)",
|
||||
form_is_custom: "Custom Package (not public)",
|
||||
singleton_rules: "Singleton Rules",
|
||||
form_is_default_fallback: "Default Fallback Package — assigned when a subscription expires",
|
||||
form_is_default_fallback: "Default Fallback Package — expired subscriptions fall back to this",
|
||||
form_trial_days: "Trial Days on Signup",
|
||||
form_trial_days_hint: "New organizations get this many free days. Only one package can have trial > 0.",
|
||||
form_trial_days_hint: "New organizations get this many free days. Only one package can have > 0.",
|
||||
per_region_pricing: "Per-Region Pricing",
|
||||
smart_calculator: "Smart Pricing Calculator",
|
||||
smart_calculator: "Smart Price Calculator",
|
||||
calc_net_price: "Net Price",
|
||||
calc_vat_rate: "VAT Rate",
|
||||
calc_currency: "Currency",
|
||||
calc_net: "Net",
|
||||
calc_vat: "VAT",
|
||||
calc_gross: "Gross",
|
||||
calc_apply: "Apply to Selected Region",
|
||||
add_zone: "Add Pricing Zone",
|
||||
add_zone_select: "Select a country code...",
|
||||
calc_apply: "Apply to selected region",
|
||||
add_zone: "Add New Zone",
|
||||
add_zone_select: "Select country code...",
|
||||
add_zone_already_exists: "This region already exists in the package pricing!"
|
||||
};
|
||||
var garages = {
|
||||
@@ -2534,7 +2574,57 @@ var garages = {
|
||||
cancel: "Cancel",
|
||||
save: "Save",
|
||||
saving: "Saving...",
|
||||
subscription_updated: "subscription updated successfully!"
|
||||
subscription_updated: "subscription updated successfully!",
|
||||
view_details: "Details",
|
||||
indefinite: "Indefinite",
|
||||
details: {
|
||||
loading: "Loading garage details...",
|
||||
retry: "Retry",
|
||||
back: "Back to garages",
|
||||
company_info: "Company Info",
|
||||
company_name: "Company Name",
|
||||
display_name: "Display Name",
|
||||
org_type: "Organization Type",
|
||||
tax_number: "Tax Number",
|
||||
reg_number: "Registration Number",
|
||||
created_at: "Created At",
|
||||
address: "Address",
|
||||
subscription_info: "Subscription Status",
|
||||
tier_name: "Package",
|
||||
tier_level: "Level",
|
||||
level_n: "Level {n}",
|
||||
expires_at: "Expires",
|
||||
asset_limit: "Vehicle Limit",
|
||||
vehicles: "vehicles",
|
||||
no_subscription: "No active subscription",
|
||||
contact_info: "Contact Info",
|
||||
contact_name: "Contact Name",
|
||||
contact_role: "Role",
|
||||
contact_department: "Department",
|
||||
contact_phone: "Phone",
|
||||
no_contact: "No primary contact person",
|
||||
coming_soon: "This feature will be available soon..."
|
||||
},
|
||||
employees: {
|
||||
title: "Employees",
|
||||
total_count: "{count} employees",
|
||||
name: "Name",
|
||||
email_phone: "Email / Phone",
|
||||
role: "Role",
|
||||
status: "Status",
|
||||
actions: "Actions",
|
||||
edit_role: "Edit",
|
||||
remove: "Remove",
|
||||
no_employees: "No employees assigned to this garage.",
|
||||
edit_role_title: "Edit Employee Role",
|
||||
cancel: "Cancel",
|
||||
save: "Save Changes",
|
||||
status_active: "Active",
|
||||
status_inactive: "Inactive",
|
||||
remove_title: "Remove Employee",
|
||||
remove_confirm: "Are you sure you want to remove \"{name}\" from this garage?",
|
||||
remove_btn: "Remove"
|
||||
}
|
||||
};
|
||||
const locale_en_46json_0b63539c = {
|
||||
permissions: permissions,
|
||||
@@ -3188,16 +3278,16 @@ _wH6JrtIxmaSoA8lCPWFnE9z4lQeXW6H5z3l5aymEQw
|
||||
const assets = {
|
||||
"/index.mjs": {
|
||||
"type": "text/javascript; charset=utf-8",
|
||||
"etag": "\"22d3a-fYKxrQk9EUMNhIo/mK+96C2r5Do\"",
|
||||
"mtime": "2026-06-25T01:04:55.828Z",
|
||||
"size": 142650,
|
||||
"etag": "\"23532-gRN4chechZSOn9PdQdfcKj3v+Ek\"",
|
||||
"mtime": "2026-06-25T19:56:11.463Z",
|
||||
"size": 144690,
|
||||
"path": "index.mjs"
|
||||
},
|
||||
"/index.mjs.map": {
|
||||
"type": "application/json",
|
||||
"etag": "\"8312b-y83NhkESVlYFSmMgPlbahLc9Kjs\"",
|
||||
"mtime": "2026-06-25T01:04:55.829Z",
|
||||
"size": 536875,
|
||||
"etag": "\"83172-ssEX0StaUacfa43NRfqyNY4W7FM\"",
|
||||
"mtime": "2026-06-25T19:56:11.464Z",
|
||||
"size": 536946,
|
||||
"path": "index.mjs.map"
|
||||
}
|
||||
};
|
||||
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/B2nIQl38.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/B2nIQl38.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./DlAUqK2U.js";import{o,c as t,J as r}from"./CHWHIiGB.js";const c={},n={class:"bg-slate-900 min-h-screen"};function a(e,l){return o(),t("div",n,[r(e.$slots,"default")])}const d=s(c,[["render",a]]);export{d as default};
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/BezjjCqI.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/BezjjCqI.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/C3lSWcZz.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/C3lSWcZz.js
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1 +1 @@
|
||||
import{_ as h}from"./Da4aCGAe.js";import{p as v,e as y,g as _,c as n,a as t,f as k,h as s,t as c,i as u,j as S,k as p,v as m,l as x,b as V,w as L,m as f,o as i,d as C}from"./CqYPuxVf.js";import{u as N}from"./CWA6Xjbg.js";const B=v("/sf_logo.png"),E={class:"min-h-screen bg-slate-900 flex items-center justify-center px-4"},R={class:"w-full max-w-md"},j={class:"bg-slate-800 rounded-xl shadow-2xl border border-slate-700 p-8"},A={key:0,class:"mb-6 p-3 rounded-lg bg-red-900/40 border border-red-700 text-red-300 text-sm"},D=["disabled"],F={key:0,class:"animate-spin h-5 w-5 text-white",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},I={class:"mt-6 text-center"},T=y({__name:"login",setup(M){const a=f(""),l=f(""),b=_(),o=N();async function g(){try{await o.login(a.value,l.value),b.push("/")}catch(d){console.error("Login failed:",d)}}return(d,e)=>{const w=h;return i(),n("div",E,[t("div",R,[e[6]||(e[6]=k('<div class="text-center mb-8"><div class="flex items-center justify-center gap-3 mb-4"><img src="'+B+'" 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>',1)),t("div",j,[s(o).error?(i(),n("div",A,c(s(o).error),1)):u("",!0),t("form",{onSubmit:S(g,["prevent"]),class:"space-y-5"},[t("div",null,[e[2]||(e[2]=t("label",{for:"email",class:"block text-sm font-medium text-slate-300 mb-1.5"}," Email Address ",-1)),p(t("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=r=>x(a)?a.value=r:null),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"},null,512),[[m,s(a)]])]),t("div",null,[e[3]||(e[3]=t("label",{for:"password",class:"block text-sm font-medium text-slate-300 mb-1.5"}," Password ",-1)),p(t("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=r=>x(l)?l.value=r:null),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"},null,512),[[m,s(l)]])]),t("button",{type:"submit",disabled:s(o).isLoading,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"},[s(o).isLoading?(i(),n("svg",F,[...e[4]||(e[4]=[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"},null,-1)])])):u("",!0),t("span",null,c(s(o).isLoading?"Signing in...":"Sign In"),1)],8,D)],32),t("div",I,[V(w,{to:"/",class:"text-sm text-slate-500 hover:text-cyan-400 transition"},{default:L(()=>[...e[5]||(e[5]=[C(" ← Back to ServiceFinder ",-1)])]),_:1})])])])])}}});export{T as default};
|
||||
import{_ as h}from"./qc1uPXiA.js";import{p as v,e as y,g as _,c as n,a as t,f as k,h as s,t as c,i as u,j as S,k as p,v as m,l as x,b as V,w as L,m as f,o as i,d as C}from"./CHWHIiGB.js";import{u as N}from"./DKEj_yij.js";const B=v("/sf_logo.png"),E={class:"min-h-screen bg-slate-900 flex items-center justify-center px-4"},R={class:"w-full max-w-md"},j={class:"bg-slate-800 rounded-xl shadow-2xl border border-slate-700 p-8"},A={key:0,class:"mb-6 p-3 rounded-lg bg-red-900/40 border border-red-700 text-red-300 text-sm"},D=["disabled"],F={key:0,class:"animate-spin h-5 w-5 text-white",xmlns:"http://www.w3.org/2000/svg",fill:"none",viewBox:"0 0 24 24"},I={class:"mt-6 text-center"},T=y({__name:"login",setup(M){const a=f(""),l=f(""),b=_(),o=N();async function g(){try{await o.login(a.value,l.value),b.push("/")}catch(d){console.error("Login failed:",d)}}return(d,e)=>{const w=h;return i(),n("div",E,[t("div",R,[e[6]||(e[6]=k('<div class="text-center mb-8"><div class="flex items-center justify-center gap-3 mb-4"><img src="'+B+'" 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>',1)),t("div",j,[s(o).error?(i(),n("div",A,c(s(o).error),1)):u("",!0),t("form",{onSubmit:S(g,["prevent"]),class:"space-y-5"},[t("div",null,[e[2]||(e[2]=t("label",{for:"email",class:"block text-sm font-medium text-slate-300 mb-1.5"}," Email Address ",-1)),p(t("input",{id:"email","onUpdate:modelValue":e[0]||(e[0]=r=>x(a)?a.value=r:null),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"},null,512),[[m,s(a)]])]),t("div",null,[e[3]||(e[3]=t("label",{for:"password",class:"block text-sm font-medium text-slate-300 mb-1.5"}," Password ",-1)),p(t("input",{id:"password","onUpdate:modelValue":e[1]||(e[1]=r=>x(l)?l.value=r:null),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"},null,512),[[m,s(l)]])]),t("button",{type:"submit",disabled:s(o).isLoading,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"},[s(o).isLoading?(i(),n("svg",F,[...e[4]||(e[4]=[t("circle",{class:"opacity-25",cx:"12",cy:"12",r:"10",stroke:"currentColor","stroke-width":"4"},null,-1),t("path",{class:"opacity-75",fill:"currentColor",d:"M4 12a8 8 0 018-8V0C5.373 0 0 5.373 0 12h4z"},null,-1)])])):u("",!0),t("span",null,c(s(o).isLoading?"Signing in...":"Sign In"),1)],8,D)],32),t("div",I,[V(w,{to:"/",class:"text-sm text-slate-500 hover:text-cyan-400 transition"},{default:L(()=>[...e[5]||(e[5]=[C(" ← Back to ServiceFinder ",-1)])]),_:1})])])])])}}});export{T as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{_ as a}from"./Da4aCGAe.js";import{_ as i,u,o as c,c as l,a as e,t as r,b as d,w as p,d as f}from"./CqYPuxVf.js";const m={class:"antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black"},g={class:"max-w-520px text-center z-20"},b=["textContent"],h=["textContent"],x={class:"flex items-center justify-center w-full"},y={__name:"error-404",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(t){const n=t;return u({title:`${n.status} - ${n.statusText} | ${n.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: }'}]}),(k,o)=>{const s=a;return c(),l("div",m,[o[0]||(o[0]=e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),e("div",g,[e("h1",{class:"font-medium mb-8 sm:text-10xl text-8xl",textContent:r(t.status)},null,8,b),e("p",{class:"font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl",textContent:r(t.description)},null,8,h),e("div",x,[d(s,{to:"/",class:"cursor-pointer gradient-border px-4 py-2 sm:px-6 sm:py-3 sm:text-xl text-md"},{default:p(()=>[f(r(t.backHome),1)]),_:1})])])])}}},v=i(y,[["__scopeId","data-v-1bd9e11a"]]);export{v as default};
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/CLBsD5qj.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/CLBsD5qj.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as s}from"./DlAUqK2U.js";import{u as a,o as i,c as u,a as e,t as o}from"./CHWHIiGB.js";const l={class:"antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black"},c={class:"max-w-520px text-center"},d=["textContent"],p=["textContent"],f={__name:"error-500",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(t){const r=t;return a({title:`${r.status} - ${r.statusText} | ${r.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: }'}]}),(g,n)=>(i(),u("div",l,[n[0]||(n[0]=e("div",{class:"-bottom-1/2 fixed h-1/2 left-0 right-0 spotlight"},null,-1)),e("div",c,[e("h1",{class:"font-medium mb-8 sm:text-10xl text-8xl",textContent:o(t.status)},null,8,d),e("p",{class:"font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl",textContent:o(t.description)},null,8,p)])]))}},h=s(f,[["__scopeId","data-v-a01dd0ba"]]);export{h as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{K as C,m as u,x as l,A as r}from"./CqYPuxVf.js";const g=C("auth",()=>{const t=u(null),o=u(null),c=u(!1),s=u(null),v=u(!1),h=l(()=>!!o.value&&!!t.value),k=l(()=>{const e=t.value?.role;return e?["SUPERADMIN","ADMIN","MODERATOR","SALES_REP","SERVICE_MGR"].includes(e.toUpperCase()):!1}),m=l(()=>{if(!t.value)return"";const{first_name:e,last_name:n}=t.value;return e&&n?`${e} ${n}`:e||n||t.value.email}),p=l(()=>t.value?.email??""),w=l(()=>t.value?.role??"guest");async function A(e,n){c.value=!0,s.value=null;try{const a=new URLSearchParams;a.append("username",e),a.append("password",n);const d=await $fetch("/api/v1/auth/login",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}),y=r("access_token",{maxAge:3600*24*7,path:"/",sameSite:"lax",secure:!0});y.value=d.access_token,o.value=d.access_token,await i()}catch(a){throw s.value=a?.data?.detail||a?.message||"Login failed",a}finally{c.value=!1}}async function i(){const n=r("access_token").value||o.value;if(n)try{const a=await $fetch("/api/v1/auth/me",{headers:{Authorization:`Bearer ${n}`}});t.value=a}catch(a){throw a?.response?.status===401&&f(),a}}function f(){o.value=null,t.value=null,s.value=null;const e=r("access_token");e.value=null}async function R(){const e=r("access_token");if(e.value){o.value=e.value;try{await i()}catch{f()}}v.value=!0}function _(){s.value=null}return{user:t,token:o,isLoading:c,error:s,isInitialized:v,isAuthenticated:h,isAdmin:k,userName:m,userEmail:p,userRole:w,login:A,fetchUser:i,logout:f,init:R,clearError:_}});export{g as u};
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
import{_ as s,u as a,o as i,c as u,a as e,t as o}from"./CqYPuxVf.js";const l={class:"antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black"},c={class:"max-w-520px text-center"},d=["textContent"],p=["textContent"],f={__name:"error-500",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(t){const n=t;return a({title:`${n.status} - ${n.statusText} | ${n.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: }'}]}),(g,r)=>(i(),u("div",l,[r[0]||(r[0]=e("div",{class:"-bottom-1/2 fixed h-1/2 left-0 right-0 spotlight"},null,-1)),e("div",c,[e("h1",{class:"font-medium mb-8 sm:text-10xl text-8xl",textContent:o(t.status)},null,8,d),e("p",{class:"font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl",textContent:o(t.description)},null,8,p)])]))}},b=s(f,[["__scopeId","data-v-a01dd0ba"]]);export{b as default};
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/DKEj_yij.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/DKEj_yij.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{a3 as C,m as u,x as l,z as r}from"./CHWHIiGB.js";const g=C("auth",()=>{const t=u(null),o=u(null),c=u(!1),s=u(null),v=u(!1),h=l(()=>!!o.value&&!!t.value),k=l(()=>{const e=t.value?.role;return e?["SUPERADMIN","ADMIN","MODERATOR","SALES_REP","SERVICE_MGR"].includes(e.toUpperCase()):!1}),m=l(()=>{if(!t.value)return"";const{first_name:e,last_name:n}=t.value;return e&&n?`${e} ${n}`:e||n||t.value.email}),p=l(()=>t.value?.email??""),w=l(()=>t.value?.role??"guest");async function R(e,n){c.value=!0,s.value=null;try{const a=new URLSearchParams;a.append("username",e),a.append("password",n);const d=await $fetch("/api/v1/auth/login",{method:"POST",headers:{"Content-Type":"application/x-www-form-urlencoded"},body:a}),A=r("access_token",{maxAge:3600*24*7,path:"/",sameSite:"lax",secure:!0});A.value=d.access_token,o.value=d.access_token,await i()}catch(a){throw s.value=a?.data?.detail||a?.message||"Login failed",a}finally{c.value=!1}}async function i(){const n=r("access_token").value||o.value;if(n)try{const a=await $fetch("/api/v1/auth/me",{headers:{Authorization:`Bearer ${n}`}});t.value=a}catch(a){throw a?.response?.status===401&&f(),a}}function f(){o.value=null,t.value=null,s.value=null;const e=r("access_token");e.value=null}async function _(){const e=r("access_token");if(e.value){o.value=e.value;try{await i()}catch{f()}}v.value=!0}function y(){s.value=null}return{user:t,token:o,isLoading:c,error:s,isInitialized:v,isAuthenticated:h,isAdmin:k,userName:m,userEmail:p,userRole:w,login:R,fetchUser:i,logout:f,init:_,clearError:y}});export{g as u};
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/DSOY2KzZ.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/DSOY2KzZ.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{H as a,z as i,A as o,I as l}from"./CHWHIiGB.js";import{u as c}from"./DKEj_yij.js";const A=a(async(s,f)=>{let t,r;if(s.path==="/login")return;if(!i("access_token").value)return o("/login");const e=c();if(!e.user)try{[t,r]=l(()=>e.fetchUser()),await t,r()}catch{return e.logout(),o("/login")}if(!e.user)return e.logout(),o("/login");const u=["SUPERADMIN","ADMIN","MODERATOR","SALES_REP","SERVICE_MGR"],n=(e.user.role||"").toUpperCase();if(!u.includes(n))return e.logout(),o("/login")});export{A as default};
|
||||
@@ -1 +0,0 @@
|
||||
import{K as _,m as u,x as a}from"./CqYPuxVf.js";const h=_("region",()=>{const t=u([]),n=u(null),c=u(!1),l=u(null),o=a(()=>t.value.find(e=>e.country_code==="DEFAULT")||null),s=a(()=>{const e=new Map;for(const r of t.value)e.set(r.country_code,r);return e}),i=a(()=>n.value?.currency||o.value?.currency||"EUR"),v=a(()=>n.value?.locale_code||o.value?.locale_code||"en-EU"),f=a(()=>n.value?.default_vat_rate??o.value?.default_vat_rate??0),d=a(()=>n.value?.timezone||o.value?.timezone||"Europe/Brussels");async function g(){if(!(t.value.length>0)){c.value=!0,l.value=null;try{const e=await $fetch("/api/v1/system/regions");t.value=e||[]}catch(e){l.value=e?.data?.detail||e?.message||"Failed to load regions",console.error("[RegionStore] Fetch error:",e)}finally{c.value=!1}}}function m(e){const r=t.value.find(R=>R.country_code===e);n.value=r||o.value}function y(e){return s.value.get(e)}return{regions:t,activeRegion:n,isLoading:c,error:l,defaultRegion:o,regionMap:s,activeCurrency:i,activeLocale:v,activeVatRate:f,activeTimezone:d,fetchRegions:g,setActiveRegion:m,getRegion:y}});export{h as u};
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/DiHJCuau.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/DiHJCuau.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/DlAUqK2U.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/DlAUqK2U.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
const s=(t,r)=>{const o=t.__vccOpts||t;for(const[c,e]of r)o[c]=e;return o};export{s as _};
|
||||
@@ -1 +0,0 @@
|
||||
import{B as o,A as t,C as a}from"./CqYPuxVf.js";const s=o((e,i)=>{if(e.path==="/login")return;if(!t("access_token").value)return a("/login")});export{s as default};
|
||||
1
frontend_admin/.nuxt/dist/client/_nuxt/DyJFDhDL.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/DyJFDhDL.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/HwQw-d2b.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/HwQw-d2b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/JOVMCDE9.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/JOVMCDE9.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{_ as a}from"./qc1uPXiA.js";import{_ as i}from"./DlAUqK2U.js";import{u,o as c,c as l,a as e,t as r,b as d,w as p,d as f}from"./CHWHIiGB.js";const m={class:"antialiased bg-white dark:bg-black dark:text-white font-sans grid min-h-screen overflow-hidden place-content-center text-black"},g={class:"max-w-520px text-center z-20"},b=["textContent"],h=["textContent"],x={class:"flex items-center justify-center w-full"},y={__name:"error-404",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(t){const n=t;return u({title:`${n.status} - ${n.statusText} | ${n.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: }'}]}),(k,o)=>{const s=a;return c(),l("div",m,[o[0]||(o[0]=e("div",{class:"fixed left-0 right-0 spotlight z-10"},null,-1)),e("div",g,[e("h1",{class:"font-medium mb-8 sm:text-10xl text-8xl",textContent:r(t.status)},null,8,b),e("p",{class:"font-light leading-tight mb-16 px-8 sm:px-0 sm:text-4xl text-xl",textContent:r(t.description)},null,8,h),e("div",x,[d(s,{to:"/",class:"cursor-pointer gradient-border px-4 py-2 sm:px-6 sm:py-3 sm:text-xl text-md"},{default:p(()=>[f(r(t.backHome),1)]),_:1})])])])}}},z=i(y,[["__scopeId","data-v-1bd9e11a"]]);export{z as default};
|
||||
1
frontend_admin/.nuxt/dist/client/_nuxt/KwNF0Piy.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/KwNF0Piy.js
vendored
Normal file
File diff suppressed because one or more lines are too long
5
frontend_admin/.nuxt/dist/client/_nuxt/d4dk63Pu.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/client/_nuxt/d4dk63Pu.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/j8avB3IT.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/j8avB3IT.js
vendored
Normal file
@@ -0,0 +1 @@
|
||||
import{a3 as _,m as u,x as a}from"./CHWHIiGB.js";const h=_("region",()=>{const t=u([]),n=u(null),c=u(!1),l=u(null),o=a(()=>t.value.find(e=>e.country_code==="DEFAULT")||null),s=a(()=>{const e=new Map;for(const r of t.value)e.set(r.country_code,r);return e}),i=a(()=>n.value?.currency||o.value?.currency||"EUR"),v=a(()=>n.value?.locale_code||o.value?.locale_code||"en-EU"),f=a(()=>n.value?.default_vat_rate??o.value?.default_vat_rate??0),d=a(()=>n.value?.timezone||o.value?.timezone||"Europe/Brussels");async function g(){if(!(t.value.length>0)){c.value=!0,l.value=null;try{const e=await $fetch("/api/v1/system/regions");t.value=e||[]}catch(e){l.value=e?.data?.detail||e?.message||"Failed to load regions",console.error("[RegionStore] Fetch error:",e)}finally{c.value=!1}}}function m(e){const r=t.value.find(R=>R.country_code===e);n.value=r||o.value}function y(e){return s.value.get(e)}return{regions:t,activeRegion:n,isLoading:c,error:l,defaultRegion:o,regionMap:s,activeCurrency:i,activeLocale:v,activeVatRate:f,activeTimezone:d,fetchRegions:g,setActiveRegion:m,getRegion:y}});export{h as u};
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/client/_nuxt/qc1uPXiA.js
vendored
Normal file
1
frontend_admin/.nuxt/dist/client/_nuxt/qc1uPXiA.js
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
11
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js
vendored
Normal file
11
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
const _export_sfc = (sfc, props) => {
|
||||
const target = sfc.__vccOpts || sfc;
|
||||
for (const [key, val] of props) {
|
||||
target[key] = val;
|
||||
}
|
||||
return target;
|
||||
};
|
||||
export {
|
||||
_export_sfc as _
|
||||
};
|
||||
//# sourceMappingURL=_plugin-vue_export-helper-1tPrXgE0.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"_plugin-vue_export-helper-1tPrXgE0.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/_plugin-vue_export-helper-1tPrXgE0.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"_plugin-vue_export-helper-1tPrXgE0.js","mappings":";;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
54
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js
vendored
Normal file
54
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js
vendored
Normal file
@@ -0,0 +1,54 @@
|
||||
import { executeAsync } from "/app/node_modules/unctx/dist/index.mjs";
|
||||
import { d as defineNuxtRouteMiddleware, c as useCookie, n as navigateTo } from "../server.mjs";
|
||||
import { u as useAuthStore } from "./auth-RwMj9LdV.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/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/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import "@vue/devtools-api";
|
||||
import "vue/server-renderer";
|
||||
const auth = defineNuxtRouteMiddleware(async (to, from) => {
|
||||
let __temp, __restore;
|
||||
if (to.path === "/login") {
|
||||
return;
|
||||
}
|
||||
const tokenCookie = useCookie("access_token");
|
||||
if (!tokenCookie.value) {
|
||||
return navigateTo("/login");
|
||||
}
|
||||
const authStore = useAuthStore();
|
||||
if (!authStore.user) {
|
||||
try {
|
||||
;
|
||||
[__temp, __restore] = executeAsync(() => authStore.fetchUser()), await __temp, __restore();
|
||||
;
|
||||
} catch {
|
||||
authStore.logout();
|
||||
return navigateTo("/login");
|
||||
}
|
||||
}
|
||||
if (!authStore.user) {
|
||||
authStore.logout();
|
||||
return navigateTo("/login");
|
||||
}
|
||||
const allowedRoles = ["SUPERADMIN", "ADMIN", "MODERATOR", "SALES_REP", "SERVICE_MGR"];
|
||||
const userRole = (authStore.user.role || "").toUpperCase();
|
||||
if (!allowedRoles.includes(userRole)) {
|
||||
authStore.logout();
|
||||
return navigateTo("/login");
|
||||
}
|
||||
});
|
||||
export {
|
||||
auth as default
|
||||
};
|
||||
//# sourceMappingURL=auth-9ekP0oPk.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"auth-9ekP0oPk.js","sources":["../../../../middleware/auth.ts"],"sourcesContent":["export default defineNuxtRouteMiddleware(async (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 // ── RBAC: Verify user role from Pinia authStore ──────────────────────\n const authStore = useAuthStore()\n\n // If the user profile hasn't been loaded yet, try to fetch it\n if (!authStore.user) {\n try {\n await authStore.fetchUser()\n } catch {\n // Token is invalid or expired — clear and redirect to login\n authStore.logout()\n return navigateTo('/login')\n }\n }\n\n // After fetch, check if user is still null (fetch failed silently)\n if (!authStore.user) {\n authStore.logout()\n return navigateTo('/login')\n }\n\n // Allowed staff roles that can access the admin panel\n const allowedRoles = ['SUPERADMIN', 'ADMIN', 'MODERATOR', 'SALES_REP', 'SERVICE_MGR']\n const userRole = (authStore.user.role || '').toUpperCase()\n\n if (!allowedRoles.includes(userRole)) {\n // Standard USER or unknown role — kick them out, clear token, redirect\n authStore.logout()\n return navigateTo('/login')\n }\n})\n"],"names":["__executeAsync"],"mappings":";;;;;;;;;;;;;;;;;;;AAEE,MAAA,iCAA0B,OAAA,IAAA,SAAA;AAAA,MAAA,QAAA;AACxB,MAAA,GAAA,SAAA,UAAA;AACF;AAAA,EAGA;AACA,sBAAiB,UAAO,cAAA;AACtB,MAAA,CAAA,mBAAkB;AACpB,WAAA,WAAA,QAAA;AAAA,EAGA;AAGA,oBAAe,aAAM;AACnB,MAAA,CAAA,UAAI,MAAA;AACF,QAAA;AACF;AAAA,MAAA,CAAA,QAAQ,SAAA,IAAAA,aAAA,MAAA,UAAA,UAAA,CAAA,GAAA,MAAA,QAAA,UAAA;AAAA;AAAA,IAEN,QAAA;AACA;AACF,aAAA,WAAA,QAAA;AAAA,IACF;AAAA,EAGA;AACE,MAAA,CAAA,UAAU,MAAO;AACjB;AACF,WAAA,WAAA,QAAA;AAAA,EAGA;AACA,QAAM,eAAY,CAAA,cAAe,SAAY,aAAY,aAAA,aAAA;AAEzD,QAAK,YAAa,UAAS,KAAA,QAAW,IAAA,YAAA;AAEpC,MAAA,CAAA,aAAU,SAAO,QAAA,GAAA;AACjB;AACF,WAAA,WAAA,QAAA;AAAA,EACF;;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/auth-9ekP0oPk.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"auth-9ekP0oPk.js","mappings":";;;;;;;;;;;;;;;;;;;AAEE,MAAA,iCAA0B,OAAA,IAAA,SAAA;AAAA,MAAA,QAAA;AACxB,MAAA,GAAA,SAAA,UAAA;AACF;AAAA,EAGA;AACA,sBAAiB,UAAO,cAAA;AACtB,MAAA,CAAA,mBAAkB;AACpB,WAAA,WAAA,QAAA;AAAA,EAGA;AAGA,oBAAe,aAAM;AACnB,MAAA,CAAA,UAAI,MAAA;AACF,QAAA;AACF;AAAA,MAAA,CAAA,QAAQ,SAAA,IAAAA,aAAA,MAAA,UAAA,UAAA,CAAA,GAAA,MAAA,QAAA,UAAA;AAAA;AAAA,IAEN,QAAA;AACA;AACF,aAAA,WAAA,QAAA;AAAA,IACF;AAAA,EAGA;AACE,MAAA,CAAA,UAAU,MAAO;AACjB;AACF,WAAA,WAAA,QAAA;AAAA,EAGA;AACA,QAAM,eAAY,CAAA,cAAe,SAAY,aAAY,aAAA,aAAA;AAEzD,QAAK,YAAa,UAAS,KAAA,QAAW,IAAA,YAAA;AAEpC,MAAA,CAAA,aAAU,SAAO,QAAA,GAAA;AACjB;AACF,WAAA,WAAA,QAAA;AAAA,EACF;;","names":["__executeAsync"],"sources":["../../../../middleware/auth.ts"],"sourcesContent":["export default defineNuxtRouteMiddleware(async (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 // ── RBAC: Verify user role from Pinia authStore ──────────────────────\n const authStore = useAuthStore()\n\n // If the user profile hasn't been loaded yet, try to fetch it\n if (!authStore.user) {\n try {\n await authStore.fetchUser()\n } catch {\n // Token is invalid or expired — clear and redirect to login\n authStore.logout()\n return navigateTo('/login')\n }\n }\n\n // After fetch, check if user is still null (fetch failed silently)\n if (!authStore.user) {\n authStore.logout()\n return navigateTo('/login')\n }\n\n // Allowed staff roles that can access the admin panel\n const allowedRoles = ['SUPERADMIN', 'ADMIN', 'MODERATOR', 'SALES_REP', 'SERVICE_MGR']\n const userRole = (authStore.user.role || '').toUpperCase()\n\n if (!allowedRoles.includes(userRole)) {\n // Standard USER or unknown role — kick them out, clear token, redirect\n authStore.logout()\n return navigateTo('/login')\n }\n})\n"],"version":3}
|
||||
@@ -1,31 +0,0 @@
|
||||
import { d as defineNuxtRouteMiddleware, b as useCookie, n as navigateTo } from "../server.mjs";
|
||||
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 "/app/node_modules/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import "@vue/devtools-api";
|
||||
import "vue/server-renderer";
|
||||
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-BgwR5zMA.js.map
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"auth-BgwR5zMA.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 +0,0 @@
|
||||
{"file":"auth-BgwR5zMA.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}
|
||||
@@ -1,6 +1,6 @@
|
||||
import { defineStore } from "pinia";
|
||||
import { ref, computed } from "vue";
|
||||
import { b as useCookie } from "../server.mjs";
|
||||
import { c as useCookie } from "../server.mjs";
|
||||
const useAuthStore = defineStore("auth", () => {
|
||||
const user = ref(null);
|
||||
const token = ref(null);
|
||||
@@ -113,4 +113,4 @@ const useAuthStore = defineStore("auth", () => {
|
||||
export {
|
||||
useAuthStore as u
|
||||
};
|
||||
//# sourceMappingURL=auth-mCjBoLcA.js.map
|
||||
//# sourceMappingURL=auth-RwMj9LdV.js.map
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
20
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js
vendored
Normal file
20
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js
vendored
Normal file
@@ -0,0 +1,20 @@
|
||||
import { mergeProps, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrRenderSlot } from "vue/server-renderer";
|
||||
import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
|
||||
const _sfc_main = {};
|
||||
function _sfc_ssrRender(_ctx, _push, _parent, _attrs) {
|
||||
_push(`<div${ssrRenderAttrs(mergeProps({ class: "bg-slate-900 min-h-screen" }, _attrs))}>`);
|
||||
ssrRenderSlot(_ctx.$slots, "default", {}, null, _push, _parent);
|
||||
_push(`</div>`);
|
||||
}
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("layouts/blank.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
const blank = /* @__PURE__ */ _export_sfc(_sfc_main, [["ssrRender", _sfc_ssrRender]]);
|
||||
export {
|
||||
blank as default
|
||||
};
|
||||
//# sourceMappingURL=blank-DWT4RB69.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"blank-DWT4RB69.js","sources":["../../../../layouts/blank.vue"],"sourcesContent":["<template>\n <div class=\"bg-slate-900 min-h-screen\">\n <slot />\n </div>\n</template>\n"],"names":["_ssrRenderAttrs","_mergeProps"],"mappings":";;;;;AACO,QAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,+BAA2B,MAAA,CAAA,CAAA,GAAA;;;;;;;;;;;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/blank-DWT4RB69.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"blank-DWT4RB69.js","mappings":";;;;;AACO,QAAA,OAAAA,eAAAC,WAAA,EAAA,OAAM,+BAA2B,MAAA,CAAA,CAAA,GAAA;;;;;;;;;;;","names":["_ssrRenderAttrs","_mergeProps"],"sources":["../../../../layouts/blank.vue"],"sourcesContent":["<template>\n <div class=\"bg-slate-900 min-h-screen\">\n <slot />\n </div>\n</template>\n"],"version":3}
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,11 +1,11 @@
|
||||
import { _ as __nuxt_component_0 } from "./nuxt-link-Cp-CAJwR.js";
|
||||
import { defineComponent, computed, ref, mergeProps, withCtx, createVNode, toDisplayString, openBlock, createBlock, createTextVNode, useSSRContext } from "vue";
|
||||
import { defineComponent, computed, ref, mergeProps, withCtx, createVNode, toDisplayString, unref, openBlock, createBlock, createTextVNode, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrRenderClass, ssrRenderComponent, ssrRenderAttr, ssrRenderList, ssrRenderStyle, ssrInterpolate, ssrRenderSlot } from "vue/server-renderer";
|
||||
import { publicAssetsURL } from "#internal/nuxt/paths";
|
||||
import { useRoute } from "vue-router";
|
||||
import { u as useRegionStore } from "./region-0mvXqaMM.js";
|
||||
import { a as useRouter, c as useI18n } from "../server.mjs";
|
||||
import { u as useAuthStore } from "./auth-mCjBoLcA.js";
|
||||
import { a as useRouter, b as useI18n } from "../server.mjs";
|
||||
import { u as useAuthStore } from "./auth-RwMj9LdV.js";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
@@ -36,10 +36,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
const dropdownOpen = ref(false);
|
||||
ref(null);
|
||||
const expandedGroups = ref(/* @__PURE__ */ new Set(["Központ"]));
|
||||
const userEmail = computed(() => authStore.userEmail || "admin@servicefinder.hu");
|
||||
const userEmail = computed(() => authStore.userEmail || "Ismeretlen Felhasználó");
|
||||
const userInitials = computed(() => {
|
||||
const email = authStore.userEmail;
|
||||
if (!email) return "AD";
|
||||
if (!email) return "??";
|
||||
return email.split("@")[0].split(".").map((s) => s[0]).join("").toUpperCase().slice(0, 2);
|
||||
});
|
||||
const menuGroups = [
|
||||
@@ -237,7 +237,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
});
|
||||
_push(`<!--]--></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(`<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">${ssrInterpolate(unref(authStore).userRole === "SUPERADMIN" ? "Super Administrator" : unref(authStore).userRole || "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",
|
||||
@@ -286,4 +286,4 @@ _sfc_main.setup = (props, ctx) => {
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=default-B9tlXlqE.js.map
|
||||
//# sourceMappingURL=default-DOjdWE8b.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DOjdWE8b.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DOjdWE8b.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DOjdWE8b.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/default-DOjdWE8b.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"en-BScPj1A-.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||
@@ -1 +0,0 @@
|
||||
{"file":"en-BScPj1A-.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
@@ -1,54 +1,50 @@
|
||||
const resource = {
|
||||
"permissions": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Permissions Management" } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Permissions Management — Role-based access control & subscription feature flags" } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Loading permissions data..." } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Permission Matrix — Role-based access control" } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Loading permissions..." } },
|
||||
"error_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Failed to load permissions" } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Retry" } },
|
||||
"save_changes": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Save Changes" } },
|
||||
"discard": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Discard" } },
|
||||
"modified_count": { "t": 0, "b": { "t": 2, "i": [{ "t": 4, "k": "count" }, { "t": 3, "v": " modification(s)" }] } },
|
||||
"current_tier": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Current Tier" } },
|
||||
"modified_count": { "t": 0, "b": { "t": 2, "i": [{ "t": 4, "k": "count" }, { "t": 3, "v": " changes" }] } },
|
||||
"domain_filter": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Domain Filter (Rows)" } },
|
||||
"role_filter": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Role Filter (Columns)" } },
|
||||
"select_all": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Select All" } },
|
||||
"deselect_all": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Deselect All" } },
|
||||
"all_domains": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "All" } },
|
||||
"permission": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Permission" } },
|
||||
"no_permissions": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No permissions in this domain." } },
|
||||
"current_tier": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Current Package" } },
|
||||
"expires": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Expires" } },
|
||||
"superadmin": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Superadmin" } },
|
||||
"superadmin_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Full system access — user management, billing, robots, and system configuration." } },
|
||||
"superadmin_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Full system access — users, billing, robots and system configuration." } },
|
||||
"garages": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garages" } },
|
||||
"garages_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garage-level access — vehicle management, service booking, customer data." } },
|
||||
"feature_flags": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Feature Flags" } },
|
||||
"feature_flags_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3, "v": "Subscription feature toggles — resolved from your current tier (" }, { "t": 4, "k": "tier" }, { "t": 3, "v": ")." }] } },
|
||||
"feature_flags_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3, "v": "Subscription features — based on your current plan (" }, { "t": 4, "k": "tier" }, { "t": 3, "v": ")." }] } },
|
||||
"rbac_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "RBAC Permission Matrix" } },
|
||||
"rbac_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Role-based access control — which roles can perform which admin actions." } },
|
||||
"action": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Action" } },
|
||||
"perms": {
|
||||
"user_mgmt": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "User Management" } },
|
||||
"billing_admin": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Billing Administration" } },
|
||||
"robot_config": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Robot Configuration" } },
|
||||
"system_logs": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "System Logs Access" } },
|
||||
"api_keys": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "API Key Management" } },
|
||||
"vehicle_crud": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Vehicle CRUD" } },
|
||||
"service_booking": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Service Booking" } },
|
||||
"customer_view": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Customer Data View" } },
|
||||
"report_export": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Report Export" } },
|
||||
"bulk_import": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Bulk Import" } }
|
||||
}
|
||||
"action": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Action" } }
|
||||
},
|
||||
"packages": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Package Management" } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Manage subscription packages and feature flags — Free, Premium, Enterprise" } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Manage subscription packages and features — Free, Premium, Enterprise" } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Loading packages..." } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Retry" } },
|
||||
"create_new": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Create Package" } },
|
||||
"create_new": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "New Package" } },
|
||||
"no_packages": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No packages yet" } },
|
||||
"no_packages_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Create your first subscription package to get started." } },
|
||||
"create_first": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Create First Package" } },
|
||||
"popular": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Popular" } },
|
||||
"fallback_badge": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Fallback" } },
|
||||
"trial_badge": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Trial" } },
|
||||
"month": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "month" } },
|
||||
"month": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "mo" } },
|
||||
"feature_flags": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Available Features" } },
|
||||
"edit": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Edit" } },
|
||||
"duplicate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Duplicate" } },
|
||||
"delete": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Delete" } },
|
||||
"set_as_default": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Set as default" } },
|
||||
"set_as_default": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Set as Default" } },
|
||||
"set_as_default_success": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "set as default package!" } },
|
||||
"edit_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Edit Package" } },
|
||||
"create_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Create Package" } },
|
||||
@@ -63,7 +59,7 @@ const resource = {
|
||||
"max_vehicles": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Max Vehicles" } },
|
||||
"max_garages": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Max Garages" } },
|
||||
"monthly_credits": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Monthly Credits" } },
|
||||
"tier_level": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Tier Level" } },
|
||||
"tier_level": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Level" } },
|
||||
"form_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "System Name" } },
|
||||
"form_name_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "e.g. premium_2024" } },
|
||||
"form_display_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Display Name" } },
|
||||
@@ -72,19 +68,31 @@ const resource = {
|
||||
"type_private": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Private" } },
|
||||
"type_corporate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Corporate" } },
|
||||
"form_tier_level": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Tier Level" } },
|
||||
"form_tier_level_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Higher number = more features & higher rank" } },
|
||||
"form_tier_level_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Higher number = more features and higher rank" } },
|
||||
"form_monthly_price": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Monthly Price" } },
|
||||
"form_yearly_price": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Yearly Price" } },
|
||||
"form_currency": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Currency" } },
|
||||
"form_subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Subtitle / Description" } },
|
||||
"form_subtitle_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "e.g. Best for small businesses" } },
|
||||
"form_subtitle_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "e.g. Ideal for small businesses" } },
|
||||
"form_badge": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Badge Text" } },
|
||||
"form_badge_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "e.g. Most Popular" } },
|
||||
"form_is_custom": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Custom Package (not publicly listed)" } },
|
||||
"form_is_custom": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Custom Package (not public)" } },
|
||||
"singleton_rules": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Singleton Rules" } },
|
||||
"form_is_default_fallback": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Default Fallback Package — assigned when a subscription expires" } },
|
||||
"form_is_default_fallback": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Default Fallback Package — expired subscriptions fall back to this" } },
|
||||
"form_trial_days": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Trial Days on Signup" } },
|
||||
"form_trial_days_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "New organizations get this many free days. Only one package can have trial > 0." } }
|
||||
"form_trial_days_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "New organizations get this many free days. Only one package can have > 0." } },
|
||||
"per_region_pricing": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Per-Region Pricing" } },
|
||||
"smart_calculator": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Smart Price Calculator" } },
|
||||
"calc_net_price": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Net Price" } },
|
||||
"calc_vat_rate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "VAT Rate" } },
|
||||
"calc_currency": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Currency" } },
|
||||
"calc_net": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Net" } },
|
||||
"calc_vat": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "VAT" } },
|
||||
"calc_gross": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Gross" } },
|
||||
"calc_apply": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Apply to selected region" } },
|
||||
"add_zone": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Add New Zone" } },
|
||||
"add_zone_select": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Select country code..." } },
|
||||
"add_zone_already_exists": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "This region already exists in the package pricing!" } }
|
||||
},
|
||||
"garages": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garages CRM" } },
|
||||
@@ -99,18 +107,64 @@ const resource = {
|
||||
"email": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Email" } },
|
||||
"status": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Status" } },
|
||||
"current_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Current Package" } },
|
||||
"expiration_date": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Expiration Date" } },
|
||||
"actions": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Actions" } },
|
||||
"active": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Active" } },
|
||||
"inactive": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Inactive" } },
|
||||
"suspended": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Suspended" } },
|
||||
"change_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Change Package" } },
|
||||
"manage_subscription": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Manage Subscription" } },
|
||||
"view": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "View" } },
|
||||
"activate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Activate" } },
|
||||
"deactivate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Deactivate" } },
|
||||
"no_results": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No garages match your search." } }
|
||||
"no_results": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No garages match your search." } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Loading garages..." } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Retry" } },
|
||||
"members": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "members" } },
|
||||
"free_fallback": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Free / Fallback" } },
|
||||
"expires": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Expires" } },
|
||||
"select_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Select Package" } },
|
||||
"select_package_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Select a subscription package..." } },
|
||||
"custom_expiration": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Custom Expiration Date" } },
|
||||
"optional": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "optional" } },
|
||||
"custom_expiration_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Leave empty for default duration (e.g. 30 days). For 2-5 year B2B deals, set a custom date!" } },
|
||||
"cancel": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Cancel" } },
|
||||
"save": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Save" } },
|
||||
"saving": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Saving..." } },
|
||||
"subscription_updated": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "subscription updated successfully!" } },
|
||||
"view_details": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Details" } },
|
||||
"indefinite": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Indefinite" } },
|
||||
"details": {
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Loading garage details..." } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Retry" } },
|
||||
"back": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Back to garages" } },
|
||||
"company_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Company Info" } },
|
||||
"company_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Company Name" } },
|
||||
"display_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Display Name" } },
|
||||
"org_type": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Organization Type" } },
|
||||
"tax_number": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Tax Number" } },
|
||||
"reg_number": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Registration Number" } },
|
||||
"created_at": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Created At" } },
|
||||
"address": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Address" } },
|
||||
"subscription_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Subscription Status" } },
|
||||
"tier_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Package" } },
|
||||
"tier_level": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Level" } },
|
||||
"level_n": { "t": 0, "b": { "t": 2, "i": [{ "t": 3, "v": "Level " }, { "t": 4, "k": "n" }] } },
|
||||
"expires_at": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Expires" } },
|
||||
"asset_limit": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Vehicle Limit" } },
|
||||
"vehicles": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "vehicles" } },
|
||||
"no_subscription": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No active subscription" } },
|
||||
"contact_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Contact Info" } },
|
||||
"contact_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Contact Name" } },
|
||||
"contact_role": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Role" } },
|
||||
"contact_department": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Department" } },
|
||||
"contact_phone": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Phone" } },
|
||||
"no_contact": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "No primary contact person" } },
|
||||
"coming_soon": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "This feature will be available soon..." } }
|
||||
}
|
||||
}
|
||||
};
|
||||
export {
|
||||
resource as default
|
||||
};
|
||||
//# sourceMappingURL=en-BScPj1A-.js.map
|
||||
//# sourceMappingURL=en-WIj2pBfh.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/en-WIj2pBfh.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/en-WIj2pBfh.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"en-WIj2pBfh.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/en-WIj2pBfh.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/en-WIj2pBfh.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"en-WIj2pBfh.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-B2hfTmd6.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-B2hfTmd6.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-B2hfTmd6.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-B2hfTmd6.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"entry-styles-1.mjs-B2hfTmd6.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-B2hfTmd6.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-1.mjs-B2hfTmd6.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"entry-styles-1.mjs-B2hfTmd6.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"entry-styles-1.mjs-DTfYoqFp.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
@@ -1 +0,0 @@
|
||||
{"file":"entry-styles-1.mjs-DTfYoqFp.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
File diff suppressed because one or more lines are too long
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"entry-styles-2.mjs-CM2W3GZ1.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
@@ -1 +0,0 @@
|
||||
{"file":"entry-styles-2.mjs-CM2W3GZ1.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-rU9a7bNs.js
vendored
Normal file
5
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-rU9a7bNs.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-rU9a7bNs.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-rU9a7bNs.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"entry-styles-2.mjs-rU9a7bNs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-rU9a7bNs.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles-2.mjs-rU9a7bNs.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"entry-styles-2.mjs-rU9a7bNs.js","mappings":";","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
8
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.C2WXX8iB.mjs
vendored
Normal file
8
frontend_admin/.nuxt/dist/server/_nuxt/entry-styles.C2WXX8iB.mjs
vendored
Normal file
@@ -0,0 +1,8 @@
|
||||
import style_0 from "./entry-styles-1.mjs-B2hfTmd6.js";
|
||||
import style_1 from "./entry-styles-2.mjs-rU9a7bNs.js";
|
||||
import style_2 from "./entry-styles-3.mjs-C1rWf53M.js";
|
||||
export default [
|
||||
style_0,
|
||||
style_1,
|
||||
style_2
|
||||
]
|
||||
@@ -1,8 +0,0 @@
|
||||
import style_0 from "./entry-styles-1.mjs-DTfYoqFp.js";
|
||||
import style_1 from "./entry-styles-2.mjs-CM2W3GZ1.js";
|
||||
import style_2 from "./entry-styles-3.mjs-C1rWf53M.js";
|
||||
export default [
|
||||
style_0,
|
||||
style_1,
|
||||
style_2
|
||||
]
|
||||
@@ -1,7 +1,8 @@
|
||||
import { _ as __nuxt_component_0 } from "./nuxt-link-Cp-CAJwR.js";
|
||||
import { mergeProps, withCtx, createTextVNode, toDisplayString, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate, ssrRenderComponent } from "vue/server-renderer";
|
||||
import { _ as _export_sfc, u as useHead } from "../server.mjs";
|
||||
import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
|
||||
import { u as useHead } from "../server.mjs";
|
||||
import "/app/node_modules/ufo/dist/index.mjs";
|
||||
import "/app/node_modules/defu/dist/defu.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
@@ -93,4 +94,4 @@ const error404 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-1
|
||||
export {
|
||||
error404 as default
|
||||
};
|
||||
//# sourceMappingURL=error-404-C_elhLNc.js.map
|
||||
//# sourceMappingURL=error-404-Bkg5lg69.js.map
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-Bkg5lg69.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-404-Bkg5lg69.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,6 +1,7 @@
|
||||
import { mergeProps, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate } from "vue/server-renderer";
|
||||
import { _ as _export_sfc, u as useHead } from "../server.mjs";
|
||||
import { _ as _export_sfc } from "./_plugin-vue_export-helper-1tPrXgE0.js";
|
||||
import { u as useHead } from "../server.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
@@ -71,4 +72,4 @@ const error500 = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a
|
||||
export {
|
||||
error500 as default
|
||||
};
|
||||
//# sourceMappingURL=error-500-C6MJq2Cl.js.map
|
||||
//# sourceMappingURL=error-500-DfEH3Z64.js.map
|
||||
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-DfEH3Z64.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/error-500-DfEH3Z64.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
@@ -1,13 +1,20 @@
|
||||
const resource = {
|
||||
"permissions": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Jogosultság Kezelés" } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Permissions Management — Role-based access control & subscription feature flags" } },
|
||||
"subtitle": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Jogosultsági Mátrix — Szerepkör alapú hozzáférés-vezérlés" } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Jogosultságok betöltése..." } },
|
||||
"error_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nem sikerült betölteni a jogosultságokat" } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Újra" } },
|
||||
"save_changes": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Változtatások Mentése" } },
|
||||
"discard": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Elvetés" } },
|
||||
"modified_count": { "t": 0, "b": { "t": 2, "i": [{ "t": 4, "k": "count" }, { "t": 3, "v": " módosítás" }] } },
|
||||
"domain_filter": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Tartomány Szűrő (Sorok)" } },
|
||||
"role_filter": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szerepkör Szűrő (Oszlopok)" } },
|
||||
"select_all": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Összes kiválasztása" } },
|
||||
"deselect_all": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Összes elrejtése" } },
|
||||
"all_domains": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Minden" } },
|
||||
"permission": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Engedély" } },
|
||||
"no_permissions": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nincsenek engedélyek ebben a tartományban." } },
|
||||
"current_tier": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Aktuális Csomag" } },
|
||||
"expires": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Lejárat" } },
|
||||
"superadmin": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Superadmin" } },
|
||||
@@ -18,19 +25,7 @@ const resource = {
|
||||
"feature_flags_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3, "v": "Előfizetési funkciók — a jelenlegi csomagod alapján (" }, { "t": 4, "k": "tier" }, { "t": 3, "v": ")." }] } },
|
||||
"rbac_title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "RBAC Jogosultsági Mátrix" } },
|
||||
"rbac_desc": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szerepkör alapú hozzáférés-vezérlés — mely szerepkörök mely admin műveleteket végezhetik." } },
|
||||
"action": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Művelet" } },
|
||||
"perms": {
|
||||
"user_mgmt": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Felhasználókezelés" } },
|
||||
"billing_admin": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Számlázási Adminisztráció" } },
|
||||
"robot_config": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Robot Konfiguráció" } },
|
||||
"system_logs": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Rendszernaplók Elérése" } },
|
||||
"api_keys": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "API Kulcs Kezelés" } },
|
||||
"vehicle_crud": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Jármű CRUD" } },
|
||||
"service_booking": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szervizfoglalás" } },
|
||||
"customer_view": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Ügyféladatok Megtekintése" } },
|
||||
"report_export": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Jelentés Exportálás" } },
|
||||
"bulk_import": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Tömeges Import" } }
|
||||
}
|
||||
"action": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Művelet" } }
|
||||
},
|
||||
"packages": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Csomagok Kezelése" } },
|
||||
@@ -47,6 +42,7 @@ const resource = {
|
||||
"month": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "hó" } },
|
||||
"feature_flags": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Elérhető Funkciók" } },
|
||||
"edit": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szerkesztés" } },
|
||||
"duplicate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Másolás" } },
|
||||
"delete": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Törlés" } },
|
||||
"set_as_default": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Beállítás alapértelmezettként" } },
|
||||
"set_as_default_success": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "alapértelmezett csomagként beállítva!" } },
|
||||
@@ -84,7 +80,19 @@ const resource = {
|
||||
"singleton_rules": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Egyediségi Szabályok" } },
|
||||
"form_is_default_fallback": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Alapértelmezett Visszaesési Csomag — lejárt előfizetés esetén erre vált" } },
|
||||
"form_trial_days": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Próba Napok Regisztrációnál" } },
|
||||
"form_trial_days_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Az új szervezetek ennyi ingyenes napot kapnak. Csak egy csomagnál lehet > 0." } }
|
||||
"form_trial_days_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Az új szervezetek ennyi ingyenes napot kapnak. Csak egy csomagnál lehet > 0." } },
|
||||
"per_region_pricing": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Régiók szerinti árazás" } },
|
||||
"smart_calculator": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Okos Árkalkulátor" } },
|
||||
"calc_net_price": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nettó ár" } },
|
||||
"calc_vat_rate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "ÁFA kulcs" } },
|
||||
"calc_currency": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Pénznem" } },
|
||||
"calc_net": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nettó" } },
|
||||
"calc_vat": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "ÁFA" } },
|
||||
"calc_gross": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Bruttó" } },
|
||||
"calc_apply": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Alkalmaz a kiválasztott régióra" } },
|
||||
"add_zone": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Új Zóna Hozzáadása" } },
|
||||
"add_zone_select": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Válassz országkódot..." } },
|
||||
"add_zone_already_exists": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Ez a régió már létezik a csomag árazásában!" } }
|
||||
},
|
||||
"garages": {
|
||||
"title": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garázsok CRM" } },
|
||||
@@ -99,18 +107,64 @@ const resource = {
|
||||
"email": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "E-mail" } },
|
||||
"status": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Státusz" } },
|
||||
"current_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Aktuális Csomag" } },
|
||||
"expiration_date": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Lejárat Dátuma" } },
|
||||
"actions": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Műveletek" } },
|
||||
"active": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Aktív" } },
|
||||
"inactive": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Inaktív" } },
|
||||
"suspended": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Felfüggesztve" } },
|
||||
"change_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Csomag Módosítása" } },
|
||||
"manage_subscription": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Előfizetés Kezelése" } },
|
||||
"view": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Megtekintés" } },
|
||||
"activate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Aktiválás" } },
|
||||
"deactivate": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Deaktiválás" } },
|
||||
"no_results": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nincs a keresésnek megfelelő garázs." } }
|
||||
"no_results": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nincs a keresésnek megfelelő garázs." } },
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garázsok betöltése..." } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Újra" } },
|
||||
"members": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "tag" } },
|
||||
"free_fallback": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Ingyenes / Visszaesési" } },
|
||||
"expires": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Lejárat" } },
|
||||
"select_package": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Csomag Kiválasztása" } },
|
||||
"select_package_placeholder": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Válassz egy előfizetési csomagot..." } },
|
||||
"custom_expiration": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Egyéni Lejárati Dátum" } },
|
||||
"optional": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "opcionális" } },
|
||||
"custom_expiration_hint": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Hagyd üresen az alapértelmezett időtartamhoz (pl. 30 nap). 2-5 éves B2B deal-eknél adj meg egyedi dátumot!" } },
|
||||
"cancel": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Mégse" } },
|
||||
"save": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Mentés" } },
|
||||
"saving": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Mentés..." } },
|
||||
"subscription_updated": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "előfizetése sikeresen frissítve!" } },
|
||||
"view_details": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Részletek" } },
|
||||
"indefinite": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Határozatlan" } },
|
||||
"details": {
|
||||
"loading": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Garázs adatainak betöltése..." } },
|
||||
"retry": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Újra" } },
|
||||
"back": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Vissza a garázsokhoz" } },
|
||||
"company_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Cég adatok" } },
|
||||
"company_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Cégnév" } },
|
||||
"display_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Megjelenítési név" } },
|
||||
"org_type": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szervezet típusa" } },
|
||||
"tax_number": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Adószám" } },
|
||||
"reg_number": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Cégjegyzékszám" } },
|
||||
"created_at": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Létrehozva" } },
|
||||
"address": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Cím" } },
|
||||
"subscription_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Előfizetés státusza" } },
|
||||
"tier_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Csomag" } },
|
||||
"tier_level": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szint" } },
|
||||
"level_n": { "t": 0, "b": { "t": 2, "i": [{ "t": 4, "k": "n" }, { "t": 3, "v": ". szint" }] } },
|
||||
"expires_at": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Lejárat" } },
|
||||
"asset_limit": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Járműkorlát" } },
|
||||
"vehicles": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "jármű" } },
|
||||
"no_subscription": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nincs aktív előfizetés" } },
|
||||
"contact_info": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Elérhetőség" } },
|
||||
"contact_name": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Kapcsolattartó neve" } },
|
||||
"contact_role": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Szerepkör" } },
|
||||
"contact_department": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Osztály" } },
|
||||
"contact_phone": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Telefonszám" } },
|
||||
"no_contact": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Nincs elsődleges kapcsolattartó" } },
|
||||
"coming_soon": { "t": 0, "b": { "t": 2, "i": [{ "t": 3 }], "s": "Ez a funkció hamarosan elérhető lesz..." } }
|
||||
}
|
||||
}
|
||||
};
|
||||
export {
|
||||
resource as default
|
||||
};
|
||||
//# sourceMappingURL=hu-CoGcC81v.js.map
|
||||
//# sourceMappingURL=hu-B3JxlqZo.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/hu-B3JxlqZo.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/hu-B3JxlqZo.js.map
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"version":3,"file":"hu-B3JxlqZo.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/hu-B3JxlqZo.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/hu-B3JxlqZo.js.map.json
vendored
Normal file
@@ -0,0 +1 @@
|
||||
{"file":"hu-B3JxlqZo.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
@@ -1 +0,0 @@
|
||||
{"version":3,"file":"hu-CoGcC81v.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
||||
@@ -1 +0,0 @@
|
||||
{"file":"hu-CoGcC81v.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;","names":[],"sources":[],"sourcesContent":[],"version":3}
|
||||
@@ -1,159 +0,0 @@
|
||||
import { defineComponent, ref, computed, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderList, ssrIncludeBooleanAttr } from "vue/server-renderer";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "../server.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
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/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import "@vue/devtools-api";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "index",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const loading = ref(true);
|
||||
const error = ref(null);
|
||||
const featureFlags = ref({
|
||||
tier: "free",
|
||||
features: {},
|
||||
expires_at: null
|
||||
});
|
||||
const permissionMatrix = ref([]);
|
||||
const allActions = ref([]);
|
||||
const modifiedPermissions = ref(/* @__PURE__ */ new Map());
|
||||
ref(/* @__PURE__ */ new Map());
|
||||
const saveNotification = ref(null);
|
||||
const featureEntries = computed(() => {
|
||||
return Object.entries(featureFlags.value.features || {});
|
||||
});
|
||||
const hasModifications = computed(() => {
|
||||
return modifiedPermissions.value.size > 0;
|
||||
});
|
||||
const tierBadgeClass = computed(() => {
|
||||
const tier = featureFlags.value.tier;
|
||||
if (tier === "enterprise") return "bg-purple-500/20 text-purple-300";
|
||||
if (tier === "premium") return "bg-amber-500/20 text-amber-300";
|
||||
return "bg-slate-500/20 text-slate-300";
|
||||
});
|
||||
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 }
|
||||
];
|
||||
function isPermEnabled(group, key) {
|
||||
const mapKey = `${group}:${key}`;
|
||||
if (modifiedPermissions.value.has(mapKey)) {
|
||||
return modifiedPermissions.value.get(mapKey);
|
||||
}
|
||||
const perms = group === "superadmin" ? superadminPerms : garagePerms;
|
||||
const perm = perms.find((p) => p.key === key);
|
||||
return perm ? perm.enabled : false;
|
||||
}
|
||||
function formatFeatureLabel(key) {
|
||||
return key.replace(/^cost_category:/, "").replace(/_/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
||||
}
|
||||
function formatDate(dateStr) {
|
||||
try {
|
||||
const d = new Date(dateStr);
|
||||
return d.toLocaleDateString("en-GB", { day: "numeric", month: "short", year: "numeric" });
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
}
|
||||
function hasPermission(role, action) {
|
||||
return role.actions.includes(action);
|
||||
}
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
_push(`<div${ssrRenderAttrs(_attrs)}><div class="mb-8"><h1 class="text-2xl font-bold text-white">${ssrInterpolate(_ctx.$t("permissions.title"))}</h1><p class="text-slate-400 mt-1">${ssrInterpolate(_ctx.$t("permissions.subtitle"))}</p></div>`);
|
||||
if (loading.value) {
|
||||
_push(`<div class="flex items-center justify-center py-20"><svg class="animate-spin h-8 w-8 text-indigo-400" 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><span class="ml-3 text-slate-400">${ssrInterpolate(_ctx.$t("permissions.loading"))}</span></div>`);
|
||||
} else if (error.value) {
|
||||
_push(`<div class="bg-red-500/10 border border-red-500/20 rounded-xl p-6 mb-8"><div class="flex items-center gap-3"><svg class="w-6 h-6 text-red-400 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><h3 class="text-red-300 font-medium">${ssrInterpolate(_ctx.$t("permissions.error_title"))}</h3><p class="text-red-400/80 text-sm mt-1">${ssrInterpolate(error.value)}</p></div></div><button class="mt-4 px-4 py-2 text-sm bg-red-600 hover:bg-red-500 text-white rounded-lg transition">${ssrInterpolate(_ctx.$t("permissions.retry"))}</button></div>`);
|
||||
} else {
|
||||
_push(`<!--[-->`);
|
||||
if (saveNotification.value) {
|
||||
_push(`<div class="${ssrRenderClass([saveNotification.value.type === "success" ? "bg-emerald-500/10 border border-emerald-500/20 text-emerald-300" : "bg-red-500/10 border border-red-500/20 text-red-300", "mb-6 px-4 py-3 rounded-lg text-sm font-medium"])}">${ssrInterpolate(saveNotification.value.message)}</div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
if (hasModifications.value) {
|
||||
_push(`<div class="mb-6 flex items-center gap-3"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><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 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(_ctx.$t("permissions.save_changes"))}</button><span class="text-sm text-slate-400">${ssrInterpolate(_ctx.$t("permissions.modified_count", { count: modifiedPermissions.value.size }))}</span></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<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><div class="text-sm text-indigo-300"><span class="font-semibold">${ssrInterpolate(_ctx.$t("permissions.current_tier"))}:</span><span class="${ssrRenderClass([tierBadgeClass.value, "ml-2 px-2 py-0.5 rounded-full text-xs font-medium"])}">${ssrInterpolate(featureFlags.value.tier || "free")}</span>`);
|
||||
if (featureFlags.value.expires_at) {
|
||||
_push(`<span class="ml-3 text-indigo-400/70">${ssrInterpolate(_ctx.$t("permissions.expires"))}: ${ssrInterpolate(formatDate(featureFlags.value.expires_at))}</span>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></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">${ssrInterpolate(_ctx.$t("permissions.superadmin"))}</h2></div><p class="text-sm text-slate-400 mb-4">${ssrInterpolate(_ctx.$t("permissions.superadmin_desc"))}</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(_ctx.$t(`permissions.perms.${perm.key}`))}</span><label class="relative inline-flex items-center cursor-pointer"><input type="checkbox"${ssrIncludeBooleanAttr(isPermEnabled("superadmin", perm.key)) ? " checked" : ""} class="sr-only peer"><div class="w-9 h-5 bg-slate-600 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-purple-500/50 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-slate-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-purple-600"></div></label></div>`);
|
||||
});
|
||||
_push(`<!--]--></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">${ssrInterpolate(_ctx.$t("permissions.garages"))}</h2></div><p class="text-sm text-slate-400 mb-4">${ssrInterpolate(_ctx.$t("permissions.garages_desc"))}</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(_ctx.$t(`permissions.perms.${perm.key}`))}</span><label class="relative inline-flex items-center cursor-pointer"><input type="checkbox"${ssrIncludeBooleanAttr(isPermEnabled("garage", perm.key)) ? " checked" : ""} class="sr-only peer"><div class="w-9 h-5 bg-slate-600 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-cyan-500/50 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-slate-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all peer-checked:bg-cyan-600"></div></label></div>`);
|
||||
});
|
||||
_push(`<!--]--></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">${ssrInterpolate(_ctx.$t("permissions.feature_flags"))}</h2></div><p class="text-sm text-slate-400 mb-4">${ssrInterpolate(_ctx.$t("permissions.feature_flags_desc", { tier: featureFlags.value.tier || "free" }))}</p><div class="space-y-3"><!--[-->`);
|
||||
ssrRenderList(featureEntries.value, ([key, granted]) => {
|
||||
_push(`<div class="flex items-center justify-between py-2 border-b border-slate-700/50 last:border-0"><div class="flex flex-col"><span class="text-sm text-slate-300">${ssrInterpolate(formatFeatureLabel(key))}</span><span class="text-xs text-slate-500">${ssrInterpolate(key)}</span></div><label class="relative inline-flex items-center cursor-pointer"><input type="checkbox"${ssrIncludeBooleanAttr(granted) ? " checked" : ""} class="sr-only peer"${ssrIncludeBooleanAttr(true) ? " disabled" : ""}><div class="${ssrRenderClass([granted ? "peer-checked:bg-amber-600" : "", "w-9 h-5 bg-slate-600 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-amber-500/50 rounded-full peer peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-slate-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all"])}"></div></label></div>`);
|
||||
});
|
||||
_push(`<!--]--></div></div></div><div class="bg-slate-800/50 border border-slate-700 rounded-xl p-6 mb-8"><h3 class="text-lg font-semibold text-white mb-4">${ssrInterpolate(_ctx.$t("permissions.rbac_title"))}</h3><p class="text-sm text-slate-400 mb-6">${ssrInterpolate(_ctx.$t("permissions.rbac_desc"))}</p><div class="overflow-x-auto"><table class="w-full text-sm"><thead><tr class="border-b border-slate-700"><th class="text-left py-3 px-4 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("permissions.action"))}</th><!--[-->`);
|
||||
ssrRenderList(permissionMatrix.value, (role) => {
|
||||
_push(`<th class="text-center py-3 px-4 text-slate-400 font-medium">${ssrInterpolate(role.role)}</th>`);
|
||||
});
|
||||
_push(`<!--]--></tr></thead><tbody><!--[-->`);
|
||||
ssrRenderList(allActions.value, (action) => {
|
||||
_push(`<tr class="border-b border-slate-700/50 hover:bg-slate-700/30"><td class="py-2.5 px-4 text-slate-300">${ssrInterpolate(action)}</td><!--[-->`);
|
||||
ssrRenderList(permissionMatrix.value, (role) => {
|
||||
_push(`<td class="text-center py-2.5 px-4">`);
|
||||
if (hasPermission(role, action)) {
|
||||
_push(`<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-emerald-400/10"><svg class="w-4 h-4 text-emerald-400" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M5 13l4 4L19 7"></path></svg></span>`);
|
||||
} else {
|
||||
_push(`<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-slate-700"><svg class="w-4 h-4 text-slate-500" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M6 18L18 6M6 6l12 12"></path></svg></span>`);
|
||||
}
|
||||
_push(`</td>`);
|
||||
});
|
||||
_push(`<!--]--></tr>`);
|
||||
});
|
||||
_push(`<!--]--></tbody></table></div></div>`);
|
||||
if (hasModifications.value) {
|
||||
_push(`<div class="flex items-center gap-3 pb-8"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><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 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(_ctx.$t("permissions.save_changes"))}</button><button class="px-4 py-2.5 bg-slate-700 hover:bg-slate-600 text-slate-300 font-medium rounded-lg transition">${ssrInterpolate(_ctx.$t("permissions.discard"))}</button></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<!--]-->`);
|
||||
}
|
||||
_push(`</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-7zBAzpaD.js.map
|
||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -137,6 +137,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
const saving = ref(false);
|
||||
const saveNotification = ref(null);
|
||||
const featureCapabilitiesError = ref(null);
|
||||
const selectedAddZoneCode = ref("");
|
||||
const availableRegionsToAdd = computed(() => {
|
||||
return regionStore.regions.filter((r) => {
|
||||
return r.country_code !== "DEFAULT" && !form.pricing_zones[r.country_code];
|
||||
});
|
||||
});
|
||||
const calcNetPrice = ref(0);
|
||||
const calcVatRate = ref(27);
|
||||
const calcCurrency = ref("EUR");
|
||||
@@ -151,6 +157,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
max_vehicles: 1,
|
||||
max_garages: 1,
|
||||
monthly_free_credits: 0,
|
||||
max_cost_category_depth: 3,
|
||||
advanced_reports: false,
|
||||
export_data: false,
|
||||
subtitle: "",
|
||||
badge: "",
|
||||
is_custom: false,
|
||||
@@ -165,6 +174,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
if (!zone) return 0;
|
||||
return period === "monthly" ? zone.monthly_price : zone.yearly_price;
|
||||
}
|
||||
function getZoneCreditPrice(countryCode) {
|
||||
const zone = form.pricing_zones[countryCode];
|
||||
if (!zone) return 0;
|
||||
return zone.credit_price ?? 0;
|
||||
}
|
||||
function getZoneCurrency(countryCode) {
|
||||
const zone = form.pricing_zones[countryCode];
|
||||
if (!zone) return "EUR";
|
||||
@@ -232,7 +246,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></div><div class="mb-4"><span class="text-3xl font-bold text-white">${ssrInterpolate(getFormattedPrice(pkg))}</span><span class="text-sm text-slate-400 ml-1">/ ${ssrInterpolate(_ctx.$t("packages.month"))}</span></div><p class="text-sm text-slate-400 mb-4 flex-1">${ssrInterpolate(getDescription(pkg))}</p><div class="border-t border-slate-700 pt-4 mb-4"><h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-3">${ssrInterpolate(_ctx.$t("packages.allowances"))}</h3><div class="space-y-2"><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.max_vehicles"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "max_vehicles"))}</span></div><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.max_garages"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "max_garages"))}</span></div><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.monthly_credits"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "monthly_free_credits"))}</span></div></div></div><div class="mb-4"><span class="text-xs text-slate-500">${ssrInterpolate(_ctx.$t("packages.tier_level"))}: </span><span class="text-xs font-mono text-slate-400">${ssrInterpolate(pkg.tier_level)}</span></div><div class="flex gap-2"><button class="flex-1 px-4 py-2.5 bg-indigo-600 hover:bg-indigo-500 text-white font-medium rounded-lg transition text-sm">${ssrInterpolate(_ctx.$t("packages.edit"))}</button><button class="px-3 py-2.5 bg-red-700 hover:bg-red-600 text-red-200 rounded-lg transition"${ssrRenderAttr("title", _ctx.$t("packages.delete"))}><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="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path></svg></button></div></div>`);
|
||||
_push(`</div></div><div class="mb-4"><span class="text-3xl font-bold text-white">${ssrInterpolate(getFormattedPrice(pkg))}</span><span class="text-sm text-slate-400 ml-1">/ ${ssrInterpolate(_ctx.$t("packages.month"))}</span></div><p class="text-sm text-slate-400 mb-4 flex-1">${ssrInterpolate(getDescription(pkg))}</p><div class="border-t border-slate-700 pt-4 mb-4"><h3 class="text-xs font-semibold uppercase tracking-wider text-slate-500 mb-3">${ssrInterpolate(_ctx.$t("packages.allowances"))}</h3><div class="space-y-2"><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.max_vehicles"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "max_vehicles"))}</span></div><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.max_garages"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "max_garages"))}</span></div><div class="flex items-center justify-between text-sm"><span class="text-slate-400">${ssrInterpolate(_ctx.$t("packages.monthly_credits"))}</span><span class="text-slate-200 font-medium">${ssrInterpolate(getAllowance(pkg, "monthly_free_credits"))}</span></div></div></div><div class="mb-4"><span class="text-xs text-slate-500">${ssrInterpolate(_ctx.$t("packages.tier_level"))}: </span><span class="text-xs font-mono text-slate-400">${ssrInterpolate(pkg.tier_level)}</span></div><div class="flex gap-2"><button class="flex-1 px-4 py-2.5 bg-indigo-600 hover:bg-indigo-500 text-white font-medium rounded-lg transition text-sm">${ssrInterpolate(_ctx.$t("packages.edit"))}</button><button class="px-3 py-2.5 bg-emerald-700 hover:bg-emerald-600 text-emerald-200 rounded-lg transition"${ssrRenderAttr("title", _ctx.$t("packages.duplicate"))}><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="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z"></path></svg></button><button class="px-3 py-2.5 bg-red-700 hover:bg-red-600 text-red-200 rounded-lg transition"${ssrRenderAttr("title", _ctx.$t("packages.delete"))}><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="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path></svg></button></div></div>`);
|
||||
});
|
||||
_push(`<!--]--></div>`);
|
||||
}
|
||||
@@ -248,11 +262,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
_push(`<!---->`);
|
||||
}
|
||||
if (activeTab.value === "pricing") {
|
||||
_push(`<div class="space-y-6"><div><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.per_region_pricing"))}</h4><div class="overflow-x-auto"><table class="w-full text-sm"><thead><tr class="border-b border-slate-700"><th class="text-left py-2 px-3 text-slate-400 font-medium">Region</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_monthly_price"))}</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_yearly_price"))}</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_currency"))}</th></tr></thead><tbody><!--[-->`);
|
||||
_push(`<div class="space-y-6"><div><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.per_region_pricing"))}</h4><div class="overflow-x-auto"><table class="w-full text-sm"><thead><tr class="border-b border-slate-700"><th class="text-left py-2 px-3 text-slate-400 font-medium">Region</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_monthly_price"))}</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_yearly_price"))}</th><th class="text-left py-2 px-3 text-slate-400 font-medium">Kredit Ár</th><th class="text-left py-2 px-3 text-slate-400 font-medium">${ssrInterpolate(_ctx.$t("packages.form_currency"))}</th><th class="text-left py-2 px-3 text-slate-400 font-medium"></th></tr></thead><tbody><!--[-->`);
|
||||
ssrRenderList(unref(regionStore).regions, (region) => {
|
||||
_push(`<tr class="border-b border-slate-700/50"><td class="py-2 px-3 text-slate-200 font-medium"><span class="inline-flex items-center gap-1.5"><span>${ssrInterpolate(region.country_code)}</span><span class="text-xs text-slate-500">(${ssrInterpolate(region.currency)}, ${ssrInterpolate(region.default_vat_rate)}% VAT)</span></span></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZonePrice(region.country_code, "monthly"))} type="number" step="0.01" min="0" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZonePrice(region.country_code, "yearly"))} type="number" step="0.01" min="0" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZoneCurrency(region.country_code))} type="text" maxlength="3" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent uppercase"></td></tr>`);
|
||||
_push(`<tr class="border-b border-slate-700/50"><td class="py-2 px-3 text-slate-200 font-medium"><span class="inline-flex items-center gap-1.5"><span>${ssrInterpolate(region.country_code)}</span><span class="text-xs text-slate-500">(${ssrInterpolate(region.currency)}, ${ssrInterpolate(region.default_vat_rate)}% VAT)</span></span></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZonePrice(region.country_code, "monthly"))} type="number" step="0.01" min="0" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZonePrice(region.country_code, "yearly"))} type="number" step="0.01" min="0" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZoneCreditPrice(region.country_code))} type="number" step="0.01" min="0" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></td><td class="py-2 px-3"><input${ssrRenderAttr("value", getZoneCurrency(region.country_code))} type="text" maxlength="3" class="w-full px-2 py-1.5 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent uppercase"></td><td class="py-2 px-3 text-center"><button class="p-1.5 rounded-lg text-red-400 hover:text-red-300 hover:bg-red-500/10 transition"${ssrRenderAttr("title", "Remove " + region.country_code)}><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="M19 7l-.867 12.142A2 2 0 0116.138 21H7.862a2 2 0 01-1.995-1.858L5 7m5 4v6m4-6v6m1-10V4a1 1 0 00-1-1h-4a1 1 0 00-1 1v3M4 7h16"></path></svg></button></td></tr>`);
|
||||
});
|
||||
_push(`<!--]--></tbody></table></div></div><div class="border-t border-slate-700 pt-5"><h4 class="text-sm font-semibold text-slate-300 mb-3">🧮 ${ssrInterpolate(_ctx.$t("packages.smart_calculator"))}</h4><div class="bg-slate-700/30 rounded-xl p-4 space-y-4"><div class="grid grid-cols-3 gap-4"><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.calc_net_price"))}</label><input${ssrRenderAttr("value", calcNetPrice.value)} type="number" step="0.01" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-emerald-500 focus:border-transparent" placeholder="0.00"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.calc_vat_rate"))}</label><select class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-emerald-500 focus:border-transparent"><!--[-->`);
|
||||
_push(`<!--]--></tbody></table></div><div class="flex items-center gap-3 mt-4"><select class="px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"><option value="" disabled${ssrIncludeBooleanAttr(Array.isArray(selectedAddZoneCode.value) ? ssrLooseContain(selectedAddZoneCode.value, "") : ssrLooseEqual(selectedAddZoneCode.value, "")) ? " selected" : ""}>${ssrInterpolate(_ctx.$t("packages.add_zone_select"))}</option><!--[-->`);
|
||||
ssrRenderList(availableRegionsToAdd.value, (region) => {
|
||||
_push(`<option${ssrRenderAttr("value", region.country_code)}${ssrIncludeBooleanAttr(Array.isArray(selectedAddZoneCode.value) ? ssrLooseContain(selectedAddZoneCode.value, region.country_code) : ssrLooseEqual(selectedAddZoneCode.value, region.country_code)) ? " selected" : ""}>${ssrInterpolate(region.country_code)} — ${ssrInterpolate(region.name)} (${ssrInterpolate(region.currency)}, ${ssrInterpolate(region.default_vat_rate)}% VAT) </option>`);
|
||||
});
|
||||
_push(`<!--]--></select><button${ssrIncludeBooleanAttr(!selectedAddZoneCode.value) ? " disabled" : ""} class="px-4 py-2 bg-indigo-600 hover:bg-indigo-500 disabled:bg-slate-600 disabled:cursor-not-allowed text-white text-sm font-medium rounded-lg transition flex items-center gap-2"><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 4v16m8-8H4"></path></svg> ${ssrInterpolate(_ctx.$t("packages.add_zone"))}</button></div></div><div class="border-t border-slate-700 pt-5"><h4 class="text-sm font-semibold text-slate-300 mb-3">🧮 ${ssrInterpolate(_ctx.$t("packages.smart_calculator"))}</h4><div class="bg-slate-700/30 rounded-xl p-4 space-y-4"><div class="grid grid-cols-3 gap-4"><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.calc_net_price"))}</label><input${ssrRenderAttr("value", calcNetPrice.value)} type="number" step="0.01" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-emerald-500 focus:border-transparent" placeholder="0.00"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.calc_vat_rate"))}</label><select class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-emerald-500 focus:border-transparent"><!--[-->`);
|
||||
ssrRenderList(unref(regionStore).regions, (region) => {
|
||||
_push(`<option${ssrRenderAttr("value", region.default_vat_rate)}${ssrIncludeBooleanAttr(Array.isArray(calcVatRate.value) ? ssrLooseContain(calcVatRate.value, region.default_vat_rate) : ssrLooseEqual(calcVatRate.value, region.default_vat_rate)) ? " selected" : ""}>${ssrInterpolate(region.country_code)} — ${ssrInterpolate(region.default_vat_rate)}% </option>`);
|
||||
});
|
||||
@@ -265,7 +283,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
_push(`<!---->`);
|
||||
}
|
||||
if (activeTab.value === "features") {
|
||||
_push(`<div class="space-y-5"><div><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.allowances"))}</h4><div class="grid grid-cols-3 gap-4"><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.max_vehicles"))}</label><input${ssrRenderAttr("value", form.max_vehicles)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.max_garages"))}</label><input${ssrRenderAttr("value", form.max_garages)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.monthly_credits"))}</label><input${ssrRenderAttr("value", form.monthly_free_credits)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div></div></div><div class="border-t border-slate-700 pt-4"><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.feature_capabilities"))}</h4><textarea rows="8" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm font-mono focus:ring-2 focus:ring-indigo-500 focus:border-transparent" placeholder="{\\n "ai_analysis": true,\\n "priority_support": false,\\n "api_access": true\\n}">${ssrInterpolate(form.feature_capabilities_json)}</textarea><p class="text-xs text-slate-500 mt-1">${ssrInterpolate(_ctx.$t("packages.feature_capabilities_hint"))}</p>`);
|
||||
_push(`<div class="space-y-5"><div><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.allowances"))}</h4><div class="grid grid-cols-3 gap-4"><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.max_vehicles"))}</label><input${ssrRenderAttr("value", form.max_vehicles)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.max_garages"))}</label><input${ssrRenderAttr("value", form.max_garages)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div><div><label class="block text-xs text-slate-400 mb-1">${ssrInterpolate(_ctx.$t("packages.monthly_credits"))}</label><input${ssrRenderAttr("value", form.monthly_free_credits)} type="number" min="0" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div></div></div><div class="border-t border-slate-700 pt-4"><h4 class="text-sm font-semibold text-slate-300 mb-3">SaaS Allowances</h4><div class="grid grid-cols-3 gap-4"><div><label class="block text-xs text-slate-400 mb-1">Költségkategória mélység (max_cost_category_depth)</label><input${ssrRenderAttr("value", form.max_cost_category_depth)} type="number" min="0" max="10" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm focus:ring-2 focus:ring-indigo-500 focus:border-transparent"></div><div><label class="block text-xs text-slate-400 mb-1">Statisztika (advanced_reports)</label><div class="flex items-center h-[38px]"><label class="relative inline-flex items-center cursor-pointer"><input${ssrIncludeBooleanAttr(Array.isArray(form.advanced_reports) ? ssrLooseContain(form.advanced_reports, null) : form.advanced_reports) ? " checked" : ""} type="checkbox" class="sr-only peer"><div class="w-11 h-6 bg-slate-600 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-indigo-500 rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-indigo-600"></div><span class="ms-3 text-sm text-slate-300">${ssrInterpolate(form.advanced_reports ? "Enabled" : "Disabled")}</span></label></div></div><div><label class="block text-xs text-slate-400 mb-1">PDF/CSV Export (export_data)</label><div class="flex items-center h-[38px]"><label class="relative inline-flex items-center cursor-pointer"><input${ssrIncludeBooleanAttr(Array.isArray(form.export_data) ? ssrLooseContain(form.export_data, null) : form.export_data) ? " checked" : ""} type="checkbox" class="sr-only peer"><div class="w-11 h-6 bg-slate-600 peer-focus:outline-none peer-focus:ring-2 peer-focus:ring-indigo-500 rounded-full peer peer-checked:after:translate-x-full rtl:peer-checked:after:-translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:start-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-5 after:w-5 after:transition-all peer-checked:bg-indigo-600"></div><span class="ms-3 text-sm text-slate-300">${ssrInterpolate(form.export_data ? "Enabled" : "Disabled")}</span></label></div></div></div></div><div class="border-t border-slate-700 pt-4"><h4 class="text-sm font-semibold text-slate-300 mb-3">${ssrInterpolate(_ctx.$t("packages.feature_capabilities"))}</h4><textarea rows="8" class="w-full px-3 py-2 bg-slate-700 border border-slate-600 rounded-lg text-white text-sm font-mono focus:ring-2 focus:ring-indigo-500 focus:border-transparent" placeholder="{\\n "ai_analysis": true,\\n "priority_support": false,\\n "api_access": true\\n}">${ssrInterpolate(form.feature_capabilities_json)}</textarea><p class="text-xs text-slate-500 mt-1">${ssrInterpolate(_ctx.$t("packages.feature_capabilities_hint"))}</p>`);
|
||||
if (featureCapabilitiesError.value) {
|
||||
_push(`<p class="text-xs text-red-400 mt-1">${ssrInterpolate(featureCapabilitiesError.value)}</p>`);
|
||||
} else {
|
||||
@@ -308,4 +326,4 @@ _sfc_main.setup = (props, ctx) => {
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=index-BPETUF7a.js.map
|
||||
//# sourceMappingURL=index-CII1lBpk.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/index-CII1lBpk.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-CII1lBpk.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-CII1lBpk.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-CII1lBpk.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
195
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js
vendored
Normal file
195
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js
vendored
Normal file
@@ -0,0 +1,195 @@
|
||||
import { defineComponent, ref, computed, unref, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderList, ssrIncludeBooleanAttr, ssrRenderAttr } from "vue/server-renderer";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import { b as useI18n } from "../server.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
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/cookie-es/dist/index.mjs";
|
||||
import "/app/node_modules/destr/dist/index.mjs";
|
||||
import "/app/node_modules/ohash/dist/index.mjs";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import "@vue/devtools-api";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "index",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
const { t: $t } = useI18n();
|
||||
const loading = ref(true);
|
||||
const error = ref(null);
|
||||
const roles = ref([]);
|
||||
const permissions = ref([]);
|
||||
const activeDomain = ref("__all__");
|
||||
const filteredRoleIds = ref(/* @__PURE__ */ new Set());
|
||||
const modifiedRoles = ref(/* @__PURE__ */ new Map());
|
||||
ref(/* @__PURE__ */ new Map());
|
||||
const saveNotification = ref(null);
|
||||
const domainOptions = computed(() => {
|
||||
const domains = new Set(permissions.value.map((p) => p.domain));
|
||||
const options = [
|
||||
{ value: "__all__", label: $t("permissions.all_domains") }
|
||||
];
|
||||
for (const domain of Array.from(domains).sort()) {
|
||||
options.push({ value: domain, label: domain.charAt(0).toUpperCase() + domain.slice(1) });
|
||||
}
|
||||
return options;
|
||||
});
|
||||
const filteredDomains = computed(() => {
|
||||
const domains = new Set(permissions.value.map((p) => p.domain));
|
||||
const sorted = Array.from(domains).sort();
|
||||
if (activeDomain.value === "__all__") return sorted;
|
||||
return sorted.filter((d) => d === activeDomain.value);
|
||||
});
|
||||
const filteredPermissions = computed(() => {
|
||||
if (activeDomain.value === "__all__") return permissions.value;
|
||||
return permissions.value.filter((p) => p.domain === activeDomain.value);
|
||||
});
|
||||
const filteredRoles = computed(() => {
|
||||
if (filteredRoleIds.value.size === 0) return roles.value;
|
||||
return roles.value.filter((r) => filteredRoleIds.value.has(r.id));
|
||||
});
|
||||
const hasModifications = computed(() => {
|
||||
return modifiedRoles.value.size > 0;
|
||||
});
|
||||
function roleHeaderClass(role) {
|
||||
if (role.rank >= 100) return "bg-purple-500/20 text-purple-300";
|
||||
if (role.rank >= 80) return "bg-indigo-500/20 text-indigo-300";
|
||||
if (role.rank >= 50) return "bg-cyan-500/20 text-cyan-300";
|
||||
return "bg-slate-500/20 text-slate-300";
|
||||
}
|
||||
function domainColorClass(domain) {
|
||||
const colorMap = {
|
||||
fleet: "text-emerald-400",
|
||||
user: "text-sky-400",
|
||||
finance: "text-amber-400",
|
||||
permissions: "text-purple-400",
|
||||
system: "text-rose-400",
|
||||
service: "text-teal-400",
|
||||
organization: "text-orange-400",
|
||||
vehicle: "text-cyan-400",
|
||||
subscription: "text-pink-400",
|
||||
moderation: "text-violet-400"
|
||||
};
|
||||
return colorMap[domain] || "text-slate-400";
|
||||
}
|
||||
function getCellClass(role, perm) {
|
||||
if (isRoleLocked(role)) return "bg-purple-900/5";
|
||||
if (isPermEnabled(role.id, perm.id)) return "bg-emerald-900/10";
|
||||
return "";
|
||||
}
|
||||
function formatPermissionLabel(perm) {
|
||||
return perm.code.replace(/:/g, " ").replace(/\b\w/g, (c) => c.toUpperCase());
|
||||
}
|
||||
function getDomainPermissions(domain) {
|
||||
return filteredPermissions.value.filter((p) => p.domain === domain);
|
||||
}
|
||||
function isPermEnabled(roleId, permissionId) {
|
||||
if (modifiedRoles.value.has(roleId)) {
|
||||
const rolePerms = modifiedRoles.value.get(roleId);
|
||||
return rolePerms.has(permissionId);
|
||||
}
|
||||
const role = roles.value.find((r) => r.id === roleId);
|
||||
return role ? role.permission_ids.includes(permissionId) : false;
|
||||
}
|
||||
function isRoleLocked(role) {
|
||||
return role.is_system && role.rank >= 100;
|
||||
}
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
_push(`<div${ssrRenderAttrs(_attrs)}><div class="mb-8"><h1 class="text-2xl font-bold text-white">${ssrInterpolate(unref($t)("permissions.title"))}</h1><p class="text-slate-400 mt-1">${ssrInterpolate(unref($t)("permissions.subtitle"))}</p></div>`);
|
||||
if (loading.value) {
|
||||
_push(`<div class="flex items-center justify-center py-20"><svg class="animate-spin h-8 w-8 text-indigo-400" 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><span class="ml-3 text-slate-400">${ssrInterpolate(unref($t)("permissions.loading"))}</span></div>`);
|
||||
} else if (error.value) {
|
||||
_push(`<div class="bg-red-500/10 border border-red-500/20 rounded-xl p-6 mb-8"><div class="flex items-center gap-3"><svg class="w-6 h-6 text-red-400 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M12 9v2m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg><div><h3 class="text-red-300 font-medium">${ssrInterpolate(unref($t)("permissions.error_title"))}</h3><p class="text-red-400/80 text-sm mt-1">${ssrInterpolate(error.value)}</p></div></div><button class="mt-4 px-4 py-2 text-sm bg-red-600 hover:bg-red-500 text-white rounded-lg transition">${ssrInterpolate(unref($t)("permissions.retry"))}</button></div>`);
|
||||
} else {
|
||||
_push(`<!--[-->`);
|
||||
if (saveNotification.value) {
|
||||
_push(`<div class="${ssrRenderClass([saveNotification.value.type === "success" ? "bg-emerald-500/10 border border-emerald-500/20 text-emerald-300" : "bg-red-500/10 border border-red-500/20 text-red-300", "mb-6 px-4 py-3 rounded-lg text-sm font-medium"])}">${ssrInterpolate(saveNotification.value.message)}</div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<div class="bg-slate-800/60 border border-slate-700 rounded-xl p-4 mb-6"><div class="flex flex-col sm:flex-row sm:items-center gap-4"><div class="flex-1"><label class="block text-xs font-semibold uppercase tracking-wider text-slate-400 mb-2">${ssrInterpolate(unref($t)("permissions.domain_filter"))}</label><div class="flex flex-wrap gap-1.5"><!--[-->`);
|
||||
ssrRenderList(domainOptions.value, (domain) => {
|
||||
_push(`<button class="${ssrRenderClass([activeDomain.value === domain.value ? "bg-indigo-600 text-white shadow-sm" : "bg-slate-700/60 text-slate-400 hover:bg-slate-700 hover:text-white", "px-3 py-1.5 text-xs font-medium rounded-lg transition"])}">${ssrInterpolate(domain.label)}</button>`);
|
||||
});
|
||||
_push(`<!--]--></div></div><div class="flex-1"><label class="block text-xs font-semibold uppercase tracking-wider text-slate-400 mb-2">${ssrInterpolate(unref($t)("permissions.role_filter"))}</label><div class="flex flex-wrap gap-1.5"><!--[-->`);
|
||||
ssrRenderList(roles.value, (role) => {
|
||||
_push(`<button class="${ssrRenderClass([filteredRoleIds.value.has(role.id) ? role.rank >= 100 ? "bg-purple-600/30 text-purple-300 border border-purple-500/30" : "bg-indigo-600/30 text-indigo-300 border border-indigo-500/30" : "bg-slate-700/60 text-slate-500 hover:bg-slate-700 hover:text-slate-300 border border-transparent", "px-3 py-1.5 text-xs font-medium rounded-lg transition flex items-center gap-1.5"])}">`);
|
||||
if (filteredRoleIds.value.has(role.id)) {
|
||||
_push(`<svg class="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="3" d="M5 13l4 4L19 7"></path></svg>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<span>${ssrInterpolate(role.name)}</span></button>`);
|
||||
});
|
||||
_push(`<!--]--></div><div class="mt-2 flex gap-2"><button class="text-xs text-indigo-400 hover:text-indigo-300 transition">${ssrInterpolate(unref($t)("permissions.select_all"))}</button><button class="text-xs text-slate-500 hover:text-slate-400 transition">${ssrInterpolate(unref($t)("permissions.deselect_all"))}</button></div></div></div></div>`);
|
||||
if (hasModifications.value) {
|
||||
_push(`<div class="sticky top-0 z-20 -mx-4 px-4 py-3 bg-slate-800/95 backdrop-blur-sm border-b border-slate-700 mb-4 flex items-center gap-3 rounded-t-xl"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><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 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(unref($t)("permissions.save_changes"))}</button><button class="px-4 py-2.5 bg-slate-700 hover:bg-slate-600 text-slate-300 font-medium rounded-lg transition">${ssrInterpolate(unref($t)("permissions.discard"))}</button><span class="text-sm text-slate-400 ml-auto">${ssrInterpolate(unref($t)("permissions.modified_count", { count: modifiedRoles.value.size }))}</span></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<div class="overflow-x-auto rounded-xl border border-slate-700 bg-slate-800/40"><table class="w-full text-sm"><thead><tr class="border-b border-slate-700"><th class="sticky left-0 z-10 bg-slate-800/95 min-w-[200px] p-3 text-left"><div class="flex items-center gap-2"><svg class="w-4 h-4 text-slate-500" 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"></path></svg><span class="text-xs font-semibold uppercase tracking-wider text-slate-400">${ssrInterpolate(unref($t)("permissions.permission"))}</span></div></th><!--[-->`);
|
||||
ssrRenderList(filteredRoles.value, (role) => {
|
||||
_push(`<th class="${ssrRenderClass([role.rank >= 100 ? "bg-purple-900/10" : "", "min-w-[120px] p-3 text-center border-l border-slate-700"])}"><div class="flex flex-col items-center gap-1"><span class="${ssrRenderClass([roleHeaderClass(role), "text-xs font-semibold px-2 py-0.5 rounded-full"])}">${ssrInterpolate(role.name)}</span><span class="text-[10px] text-slate-500">Rank ${ssrInterpolate(role.rank)}</span>`);
|
||||
if (role.is_system) {
|
||||
_push(`<span class="text-[10px] text-indigo-400">system</span>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></th>`);
|
||||
});
|
||||
_push(`<!--]--></tr></thead><tbody><!--[-->`);
|
||||
ssrRenderList(filteredDomains.value, (domain) => {
|
||||
_push(`<!--[--><tr class="border-b border-slate-700/50"><td colspan="1" class="${ssrRenderClass([domainColorClass(domain), "sticky left-0 z-10 bg-slate-800/95 px-3 py-2 text-xs font-bold uppercase tracking-wider"])}"><div class="flex items-center gap-2"><span>${ssrInterpolate(domain)}</span><span class="text-[10px] text-slate-500 font-normal normal-case"> (${ssrInterpolate(getDomainPermissions(domain).length)}) </span></div></td><!--[-->`);
|
||||
ssrRenderList(filteredRoles.value, (role) => {
|
||||
_push(`<td class="border-l border-slate-700/50 bg-slate-800/60 px-3 py-2"></td>`);
|
||||
});
|
||||
_push(`<!--]--></tr><!--[-->`);
|
||||
ssrRenderList(getDomainPermissions(domain), (perm) => {
|
||||
_push(`<tr class="border-b border-slate-700/30 hover:bg-slate-700/20 transition"><td class="sticky left-0 z-10 bg-slate-800/95 p-3 border-r border-slate-700/50"><div class="flex flex-col min-w-0 max-w-[200px]"><span class="text-sm text-slate-200 truncate font-medium">${ssrInterpolate(formatPermissionLabel(perm))}</span><span class="text-xs text-slate-500 truncate font-mono">${ssrInterpolate(perm.code)}</span>`);
|
||||
if (perm.description) {
|
||||
_push(`<span class="text-[11px] text-slate-500 truncate mt-0.5">${ssrInterpolate(perm.description)}</span>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div></td><!--[-->`);
|
||||
ssrRenderList(filteredRoles.value, (role) => {
|
||||
_push(`<td class="${ssrRenderClass([getCellClass(role, perm), "p-3 text-center border-l border-slate-700/30"])}"><label class="${ssrRenderClass([{ "cursor-not-allowed opacity-40": isRoleLocked(role) }, "relative inline-flex items-center justify-center cursor-pointer"])}"><input type="checkbox"${ssrIncludeBooleanAttr(isPermEnabled(role.id, perm.id)) ? " checked" : ""} class="sr-only peer"${ssrIncludeBooleanAttr(isRoleLocked(role)) ? " disabled" : ""}><div class="${ssrRenderClass([isRoleLocked(role) ? "bg-slate-600" : isPermEnabled(role.id, perm.id) ? "bg-emerald-600 peer-focus:ring-emerald-500/50 peer-checked:after:translate-x-full peer-checked:after:border-white" : "bg-slate-600 peer-focus:ring-indigo-500/50 peer-checked:after:translate-x-full peer-checked:after:border-white peer-checked:bg-indigo-600", "w-9 h-5 rounded-full peer peer-focus:outline-none peer-focus:ring-2 transition-all after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-slate-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all"])}"></div></label></td>`);
|
||||
});
|
||||
_push(`<!--]--></tr>`);
|
||||
});
|
||||
_push(`<!--]--><!--]-->`);
|
||||
});
|
||||
_push(`<!--]-->`);
|
||||
if (filteredPermissions.value.length === 0) {
|
||||
_push(`<tr><td${ssrRenderAttr("colspan", filteredRoles.value.length + 1)} class="p-8 text-center text-slate-500 text-sm">${ssrInterpolate(unref($t)("permissions.no_permissions"))}</td></tr>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</tbody></table></div>`);
|
||||
if (hasModifications.value) {
|
||||
_push(`<div class="mt-6 flex items-center gap-3 pb-8"><button class="px-6 py-2.5 bg-emerald-600 hover:bg-emerald-500 text-white font-semibold rounded-lg shadow-lg shadow-emerald-600/20 transition-all hover:scale-[1.02] active:scale-[0.98] flex items-center gap-2"><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 7H5a2 2 0 00-2 2v9a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-3m-1 4l-3 3m0 0l-3-3m3 3V4"></path></svg> ${ssrInterpolate(unref($t)("permissions.save_changes"))}</button><button class="px-4 py-2.5 bg-slate-700 hover:bg-slate-600 text-slate-300 font-medium rounded-lg transition">${ssrInterpolate(unref($t)("permissions.discard"))}</button><span class="text-sm text-slate-400">${ssrInterpolate(unref($t)("permissions.modified_count", { count: modifiedRoles.value.size }))}</span></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<!--]-->`);
|
||||
}
|
||||
_push(`</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-D2n0yf-2.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-D2n0yf-2.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
182
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js
vendored
Normal file
182
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js
vendored
Normal file
@@ -0,0 +1,182 @@
|
||||
import { defineComponent, ref, computed, useSSRContext } from "vue";
|
||||
import { ssrRenderAttrs, ssrInterpolate, ssrRenderClass, ssrRenderList } from "vue/server-renderer";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
import "/app/node_modules/hookable/dist/index.mjs";
|
||||
import "/app/node_modules/klona/dist/index.mjs";
|
||||
import "../server.mjs";
|
||||
import "/app/node_modules/ofetch/dist/node.mjs";
|
||||
import "#internal/nuxt/paths";
|
||||
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 "/app/node_modules/ufo/dist/index.mjs";
|
||||
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";
|
||||
import "/app/node_modules/@unhead/vue/dist/index.mjs";
|
||||
import "@vue/devtools-api";
|
||||
const _sfc_main = /* @__PURE__ */ defineComponent({
|
||||
__name: "index",
|
||||
__ssrInlineRender: true,
|
||||
setup(__props) {
|
||||
useRoute();
|
||||
useRouter();
|
||||
const loading = ref(true);
|
||||
const error = ref(null);
|
||||
const garage = ref(null);
|
||||
const activeTab = ref("general");
|
||||
const tabs = [
|
||||
{ key: "general", label: "Általános" },
|
||||
{ key: "employees", label: "Dolgozók" },
|
||||
{ key: "fleet", label: "Flotta" },
|
||||
{ key: "analytics", label: "Analitika" }
|
||||
];
|
||||
const formattedAddress = computed(() => {
|
||||
if (!garage.value) return "—";
|
||||
const parts = [];
|
||||
if (garage.value.address_zip) parts.push(garage.value.address_zip);
|
||||
if (garage.value.address_city) parts.push(garage.value.address_city);
|
||||
const streetParts = [];
|
||||
if (garage.value.address_street_name) streetParts.push(garage.value.address_street_name);
|
||||
if (garage.value.address_street_type) streetParts.push(garage.value.address_street_type);
|
||||
if (garage.value.address_house_number) streetParts.push(garage.value.address_house_number);
|
||||
if (streetParts.length > 0) parts.push(streetParts.join(" "));
|
||||
return parts.length > 0 ? parts.join(", ") : "—";
|
||||
});
|
||||
function garageDisplayName(g) {
|
||||
return g.display_name || g.name || g.full_name;
|
||||
}
|
||||
function getInitials(name) {
|
||||
return name.split(" ").map((w) => w.charAt(0)).join("").toUpperCase().slice(0, 2);
|
||||
}
|
||||
function getInitialsColor(name) {
|
||||
const colors = [
|
||||
"bg-amber-600",
|
||||
"bg-purple-600",
|
||||
"bg-slate-600",
|
||||
"bg-indigo-600",
|
||||
"bg-emerald-600",
|
||||
"bg-rose-600",
|
||||
"bg-cyan-600",
|
||||
"bg-orange-600",
|
||||
"bg-teal-600"
|
||||
];
|
||||
let hash = 0;
|
||||
for (let i = 0; i < name.length; i++) {
|
||||
hash = name.charCodeAt(i) + ((hash << 5) - hash);
|
||||
}
|
||||
return colors[Math.abs(hash) % colors.length];
|
||||
}
|
||||
function statusBadgeClass(status) {
|
||||
if (status === "active") return "bg-emerald-500/10 text-emerald-400";
|
||||
if (status === "suspended") return "bg-red-500/10 text-red-400";
|
||||
if (status === "pending_verification") return "bg-amber-500/10 text-amber-400";
|
||||
return "bg-slate-500/10 text-slate-400";
|
||||
}
|
||||
function statusDotClass(status) {
|
||||
if (status === "active") return "bg-emerald-400";
|
||||
if (status === "suspended") return "bg-red-400";
|
||||
if (status === "pending_verification") return "bg-amber-400";
|
||||
return "bg-slate-400";
|
||||
}
|
||||
function statusLabel(status) {
|
||||
if (status === "active") return "Aktív";
|
||||
if (status === "suspended") return "Felfüggesztve";
|
||||
if (status === "pending_verification") return "Függőben";
|
||||
return "Inaktív";
|
||||
}
|
||||
function tierBadgeClass(tierName) {
|
||||
const name = tierName.toLowerCase();
|
||||
if (name.includes("enterprise") || name.includes("vip") || name.includes("corp")) return "bg-purple-500/20 text-purple-300";
|
||||
if (name.includes("premium") || name.includes("pro")) return "bg-amber-500/20 text-amber-300";
|
||||
return "bg-slate-500/20 text-slate-300";
|
||||
}
|
||||
function orgTypeLabel(type) {
|
||||
const labels = {
|
||||
individual: "Magánszemély",
|
||||
service: "Szerviz",
|
||||
service_provider: "Szolgáltató",
|
||||
fleet_owner: "Flottatulajdonos",
|
||||
club: "Klub",
|
||||
business: "Vállalkozás"
|
||||
};
|
||||
return labels[type] || type;
|
||||
}
|
||||
function formatDate(dateStr) {
|
||||
if (!dateStr) return "—";
|
||||
try {
|
||||
const d = new Date(dateStr);
|
||||
return d.toLocaleDateString("hu-HU", {
|
||||
year: "numeric",
|
||||
month: "short",
|
||||
day: "numeric"
|
||||
});
|
||||
} catch {
|
||||
return dateStr;
|
||||
}
|
||||
}
|
||||
return (_ctx, _push, _parent, _attrs) => {
|
||||
_push(`<div${ssrRenderAttrs(_attrs)}>`);
|
||||
if (loading.value) {
|
||||
_push(`<div class="flex items-center justify-center py-20"><div class="flex flex-col items-center gap-3"><svg class="w-8 h-8 text-indigo-400 animate-spin" 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><p class="text-slate-400 text-sm">${ssrInterpolate(_ctx.$t("garages.details.loading"))}</p></div></div>`);
|
||||
} else if (error.value) {
|
||||
_push(`<div class="flex flex-col items-center justify-center py-20 text-center"><svg class="w-12 h-12 text-red-500 mb-4" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="1.5" d="M12 9v2m0 4h.01m-6.938 4h13.856c1.54 0 2.502-1.667 1.732-2.5L13.732 4c-.77-.833-1.964-.833-2.732 0L4.082 16.5c-.77.833.192 2.5 1.732 2.5z"></path></svg><p class="text-red-400 text-sm mb-2">${ssrInterpolate(error.value)}</p><button class="px-4 py-2 text-sm bg-indigo-600/20 text-indigo-300 hover:bg-indigo-600/30 rounded-lg transition">${ssrInterpolate(_ctx.$t("garages.details.retry"))}</button></div>`);
|
||||
} else if (garage.value) {
|
||||
_push(`<!--[--><div class="mb-8"><button class="inline-flex items-center gap-1.5 text-sm text-slate-400 hover:text-white transition mb-4"><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="M15 19l-7-7 7-7"></path></svg> ${ssrInterpolate(_ctx.$t("garages.details.back"))}</button><div class="flex items-center justify-between"><div class="flex items-center gap-4"><div class="${ssrRenderClass([getInitialsColor(garageDisplayName(garage.value)), "w-12 h-12 rounded-xl flex items-center justify-center text-lg font-bold text-white"])}">${ssrInterpolate(getInitials(garageDisplayName(garage.value)))}</div><div><h1 class="text-2xl font-bold text-white">${ssrInterpolate(garageDisplayName(garage.value))}</h1><p class="text-sm text-slate-400 mt-0.5">${ssrInterpolate(garage.value.full_name)} `);
|
||||
if (garage.value.tax_number) {
|
||||
_push(`<span class="ml-2 text-slate-500">· ${ssrInterpolate(_ctx.$t("garages.details.tax_number"))}: ${ssrInterpolate(garage.value.tax_number)}</span>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</p></div></div><span class="${ssrRenderClass([statusBadgeClass(garage.value.status), "inline-flex items-center px-3 py-1 rounded-full text-xs font-medium"])}"><span class="${ssrRenderClass([statusDotClass(garage.value.status), "w-1.5 h-1.5 rounded-full mr-1.5"])}"></span> ${ssrInterpolate(statusLabel(garage.value.status))}</span></div></div><div class="border-b border-slate-700 mb-6"><nav class="flex gap-6"><!--[-->`);
|
||||
ssrRenderList(tabs, (tab) => {
|
||||
_push(`<button class="${ssrRenderClass([activeTab.value === tab.key ? "text-indigo-400 border-indigo-400" : "text-slate-400 border-transparent hover:text-slate-300", "pb-3 text-sm font-medium transition border-b-2 -mb-px"])}">${ssrInterpolate(tab.label)}</button>`);
|
||||
});
|
||||
_push(`<!--]--></nav></div>`);
|
||||
if (activeTab.value === "general") {
|
||||
_push(`<div class="space-y-6"><div class="bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden"><div class="px-6 py-4 border-b border-slate-700 flex items-center gap-3"><div class="p-2 rounded-lg bg-indigo-500/10 text-indigo-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="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"></path></svg></div><h3 class="text-base font-semibold text-white">${ssrInterpolate(_ctx.$t("garages.details.company_info"))}</h3></div><div class="px-6 py-5"><div class="grid grid-cols-1 md:grid-cols-2 gap-6"><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.company_name"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.full_name)}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.display_name"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.display_name || "—")}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.org_type"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(orgTypeLabel(garage.value.org_type))}</p></div></div><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.tax_number"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.tax_number || "—")}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.reg_number"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.reg_number || "—")}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.created_at"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(formatDate(garage.value.created_at))}</p></div></div></div><div class="mt-6 pt-6 border-t border-slate-700/50"><p class="text-xs text-slate-500 uppercase tracking-wider mb-3">${ssrInterpolate(_ctx.$t("garages.details.address"))}</p><p class="text-sm text-white">${ssrInterpolate(formattedAddress.value)}</p></div></div></div><div class="bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden"><div class="px-6 py-4 border-b border-slate-700 flex items-center gap-3"><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="M3 7v10a2 2 0 002 2h14a2 2 0 002-2V9a2 2 0 00-2-2h-6l-2-2H5a2 2 0 00-2 2z"></path></svg></div><h3 class="text-base font-semibold text-white">${ssrInterpolate(_ctx.$t("garages.details.subscription_info"))}</h3></div><div class="px-6 py-5">`);
|
||||
if (garage.value.subscription) {
|
||||
_push(`<div class="grid grid-cols-1 md:grid-cols-2 gap-6"><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.tier_name"))}</p><span class="${ssrRenderClass([tierBadgeClass(garage.value.subscription.tier_name), "inline-flex mt-1 px-2.5 py-0.5 rounded-full text-xs font-medium"])}">${ssrInterpolate(garage.value.subscription.tier_name)}</span></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.tier_level"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(_ctx.$t("garages.details.level_n", { n: garage.value.subscription.tier_level }))}</p></div></div><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.expires_at"))}</p>`);
|
||||
if (garage.value.subscription.expires_at) {
|
||||
_push(`<p class="text-sm text-white mt-1">${ssrInterpolate(formatDate(garage.value.subscription.expires_at))}</p>`);
|
||||
} else {
|
||||
_push(`<p class="text-sm text-slate-400 mt-1 italic">${ssrInterpolate(_ctx.$t("garages.indefinite"))}</p>`);
|
||||
}
|
||||
_push(`</div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.asset_limit"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.subscription.asset_limit)} ${ssrInterpolate(_ctx.$t("garages.details.vehicles"))}</p></div></div></div>`);
|
||||
} else {
|
||||
_push(`<div class="text-center py-4"><p class="text-sm text-slate-400">${ssrInterpolate(_ctx.$t("garages.details.no_subscription"))}</p></div>`);
|
||||
}
|
||||
_push(`</div></div><div class="bg-slate-800/50 border border-slate-700 rounded-xl overflow-hidden"><div class="px-6 py-4 border-b border-slate-700 flex items-center gap-3"><div class="p-2 rounded-lg bg-emerald-500/10 text-emerald-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="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"></path></svg></div><h3 class="text-base font-semibold text-white">${ssrInterpolate(_ctx.$t("garages.details.contact_info"))}</h3></div><div class="px-6 py-5">`);
|
||||
if (garage.value.primary_contact) {
|
||||
_push(`<div class="grid grid-cols-1 md:grid-cols-2 gap-6"><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.contact_name"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.primary_contact.full_name)}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.contact_role"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.primary_contact.role)}</p></div></div><div class="space-y-4"><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.contact_department"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.primary_contact.department || "—")}</p></div><div><p class="text-xs text-slate-500 uppercase tracking-wider">${ssrInterpolate(_ctx.$t("garages.details.contact_phone"))}</p><p class="text-sm text-white mt-1">${ssrInterpolate(garage.value.primary_contact.phone || "—")}</p></div></div></div>`);
|
||||
} else {
|
||||
_push(`<div class="text-center py-4"><p class="text-sm text-slate-400">${ssrInterpolate(_ctx.$t("garages.details.no_contact"))}</p></div>`);
|
||||
}
|
||||
_push(`</div></div></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
if (activeTab.value !== "general") {
|
||||
_push(`<div class="flex items-center justify-center py-20"><p class="text-slate-500 text-sm">${ssrInterpolate(_ctx.$t("garages.details.coming_soon"))}</p></div>`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`<!--]-->`);
|
||||
} else {
|
||||
_push(`<!---->`);
|
||||
}
|
||||
_push(`</div>`);
|
||||
};
|
||||
}
|
||||
});
|
||||
const _sfc_setup = _sfc_main.setup;
|
||||
_sfc_main.setup = (props, ctx) => {
|
||||
const ssrContext = useSSRContext();
|
||||
(ssrContext.modules || (ssrContext.modules = /* @__PURE__ */ new Set())).add("pages/garages/[id]/index.vue");
|
||||
return _sfc_setup ? _sfc_setup(props, ctx) : void 0;
|
||||
};
|
||||
export {
|
||||
_sfc_main as default
|
||||
};
|
||||
//# sourceMappingURL=index-JpXwtL-Z.js.map
|
||||
1
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js.map
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js.map
vendored
Normal file
File diff suppressed because one or more lines are too long
1
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js.map.json
vendored
Normal file
1
frontend_admin/.nuxt/dist/server/_nuxt/index-JpXwtL-Z.js.map.json
vendored
Normal file
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user