@feedmepos/mf-hrm-portal 2.0.17 → 2.0.18-dev

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (62) hide show
  1. package/dist/AuditLogList-CaoW9uYd.js +1011 -0
  2. package/dist/CollapsibleWrapper.vue_vue_type_script_setup_true_lang-BLJlmPVa.js +58 -0
  3. package/dist/EmployeeList-DcMvF9U5.js +839 -0
  4. package/dist/FormItem.vue_vue_type_script_setup_true_lang-CoorkndT.js +34 -0
  5. package/dist/FormSection.vue_vue_type_script_setup_true_lang-DknXTYiK.js +49 -0
  6. package/dist/{Main-C7Q3OELU.js → Main-CleutFvF.js} +183 -176
  7. package/dist/{Main-CCTDT_TG.js → Main-CvW6Vu8N.js} +758 -761
  8. package/dist/Main-D7k57uq5.js +87 -0
  9. package/dist/PermissionSetList-CM7kbWkO.js +347 -0
  10. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Ces9YwYB.js +3443 -0
  11. package/dist/RoleList-DR3eVJ9f.js +545 -0
  12. package/dist/Skeleton.vue_vue_type_script_setup_true_lang-B4PxNMwq.js +16 -0
  13. package/dist/TeamMemberList-CZZv4Pu5.js +1038 -0
  14. package/dist/{TimesheetList-DhKfguOb.js → TimesheetList-WqqoKPbg.js} +132 -126
  15. package/dist/{app--3WguZOC.js → app-R5EioPr4.js} +759 -711
  16. package/dist/app.js +1 -1
  17. package/dist/{dayjs.min-RrLy0N6G.js → dayjs.min-CN15Ft3o.js} +1 -1
  18. package/dist/employee-DwQlWLkL.js +204 -0
  19. package/dist/{iteration-BQA73VxD.js → iteration-UBGGRoxQ.js} +9258 -9213
  20. package/dist/{lodash-B1ouSWpG.js → lodash-CC6qHVUo.js} +1 -1
  21. package/dist/{rule-BL-miuus.js → rule-B519XbW6.js} +263 -265
  22. package/dist/src/api/audit-log/index.d.ts +9 -0
  23. package/dist/src/api/restaurant/index.d.ts +5 -0
  24. package/dist/src/components/CheckboxInput.vue.d.ts +1 -1
  25. package/dist/src/components/CollapsibleWrapper.vue.d.ts +2 -0
  26. package/dist/src/components/Skeleton.vue.d.ts +7 -0
  27. package/dist/src/composables/useBasePermission.d.ts +1 -0
  28. package/dist/src/composables/useRestaurantMap.d.ts +2 -329
  29. package/dist/src/stores/restaurant.d.ts +181 -0
  30. package/dist/src/stores/role.d.ts +7 -7
  31. package/dist/src/stores/team.d.ts +6 -6
  32. package/dist/src/types/restaurant.d.ts +11 -0
  33. package/dist/src/types/team.d.ts +1 -1
  34. package/dist/src/views/hr/locales/index.d.ts +16 -0
  35. package/dist/src/views/team/components/BasePermission.vue.d.ts +3 -7
  36. package/dist/src/views/team/components/PosRolePermission.vue.d.ts +2 -2
  37. package/dist/src/views/team/locales/index.d.ts +32 -0
  38. package/dist/src/views/team/member/AddMemberForm.vue.d.ts +5 -3
  39. package/dist/style.css +1 -1
  40. package/dist/team-BGLhgx5P.js +33 -0
  41. package/dist/{timesheet-BbtAYZ1B.js → timesheet-BylrXRfd.js} +2 -2
  42. package/dist/tsconfig.app.tsbuildinfo +1 -1
  43. package/dist/useAppStore-Akl8AoVN.js +171 -0
  44. package/dist/useDiscardConfirm-DPhEV6v0.js +157 -0
  45. package/dist/{useLoading-D7PklYeR.js → useLoading-rbrVwWuj.js} +1 -1
  46. package/dist/{useReportPermissions-CNcISy8f.js → useReportPermissions-BOEZU86S.js} +3 -3
  47. package/dist/useSearch-BAPEUu1R.js +15 -0
  48. package/package.json +1 -1
  49. package/dist/AuditLogList-DwCmJovS.js +0 -980
  50. package/dist/EmployeeList-8166DlII.js +0 -736
  51. package/dist/FormSection.vue_vue_type_script_setup_true_lang-BVb8c4YU.js +0 -71
  52. package/dist/HorizontalSplitter-o860F4xM.js +0 -12
  53. package/dist/Main-C4LaqZaa.js +0 -85
  54. package/dist/PermissionSetList-trnHwNFR.js +0 -341
  55. package/dist/PortalPermissionEditor.vue_vue_type_script_setup_true_lang-Bc5nE9NF.js +0 -3480
  56. package/dist/RoleList-DJtbEUSC.js +0 -530
  57. package/dist/TeamMemberList-C6qx-yJi.js +0 -1108
  58. package/dist/employee-DSAStcBv.js +0 -204
  59. package/dist/useAppStore-BHWapSDk.js +0 -171
  60. package/dist/useDebounce-B8ZPVS5C.js +0 -15
  61. package/dist/useDiscardConfirm-BHni0LNu.js +0 -28
  62. package/dist/useSearch-B6WK1LBB.js +0 -15
@@ -1,980 +0,0 @@
1
- import { defineComponent as Ee, ref as p, computed as L, onMounted as ft, onBeforeUnmount as vt, watch as Q, resolveComponent as E, createElementBlock as y, openBlock as m, createBlock as oe, createCommentVNode as V, createElementVNode as l, Fragment as ee, renderList as se, withCtx as Y, createVNode as u, toDisplayString as i, unref as n, nextTick as pt } from "vue";
2
- import { d as _ } from "./dayjs.min-RrLy0N6G.js";
3
- import { useI18n as Ae, useCoreStore as bt } from "@feedmepos/mf-common";
4
- import { f as Oe, _ as gt } from "./app--3WguZOC.js";
5
- import { components as Ve } from "@feedmepos/ui-library";
6
- import { g as ht, b as yt } from "./iteration-BQA73VxD.js";
7
- import { S as ce } from "./SelectFilter-DUj7GBtT.js";
8
- import { _ as _t } from "./PageLayout.vue_vue_type_script_setup_true_lang-HKK4cbW8.js";
9
- import { _ as xt } from "./index.vue_vue_type_script_setup_true_lang-Vc5ARO29.js";
10
- import { t as Lt, p as Pe } from "./rule-BL-miuus.js";
11
- import { defineStore as St } from "pinia";
12
- const ge = [
13
- { key: "all", label: "All", subjectPrefixes: [] },
14
- { key: "inventory", label: "Inventory", subjectPrefixes: ["business::inventory", "inventory"] },
15
- { key: "report", label: "Report", subjectPrefixes: ["business::report", "report"] },
16
- { key: "hrm", label: "HRM", subjectPrefixes: ["business::hrm", "hrm"] },
17
- { key: "payment", label: "Payment", subjectPrefixes: ["business::payment", "payment"] },
18
- { key: "menu", label: "Menu", subjectPrefixes: ["business::menu", "menu"] },
19
- { key: "crm", label: "CRM", subjectPrefixes: ["business::crm", "crm"] }
20
- // Add more as modules are revamped with new actionguard:
21
- // { key: 'restaurantOperation', label: 'Restaurant Operation', subjectPrefixes: ['restaurant'] },
22
- ], kt = "/audit-logs", je = {
23
- async read(o) {
24
- var x, T, P, I, c;
25
- const a = {
26
- limit: (o == null ? void 0 : o.limit) ?? 100,
27
- offset: (o == null ? void 0 : o.offset) ?? 0,
28
- ...o != null && o.from ? { from: o.from } : {},
29
- ...o != null && o.to ? { to: o.to } : {},
30
- ...(x = o == null ? void 0 : o.userIds) != null && x.length ? { userIds: o.userIds } : {},
31
- ...(T = o == null ? void 0 : o.subjects) != null && T.length ? { subjects: o.subjects } : {},
32
- ...(P = o == null ? void 0 : o.subjectPrefixes) != null && P.length ? { subjectPrefixes: o.subjectPrefixes } : {},
33
- ...(I = o == null ? void 0 : o.actions) != null && I.length ? { actions: o.actions } : {},
34
- ...(c = o == null ? void 0 : o.outcomes) != null && c.length ? { outcomes: o.outcomes } : {}
35
- };
36
- return console.log("[AuditLogAPI] request params:", a), ht(
37
- await yt().get(kt, {
38
- params: a,
39
- // Serialize arrays as repeated params: key=val1&key=val2
40
- // (NestJS @Query expects this; axios default adds brackets which break matching)
41
- paramsSerializer: (s) => {
42
- const w = new URLSearchParams();
43
- for (const [R, g] of Object.entries(s))
44
- if (Array.isArray(g))
45
- for (const j of g) w.append(R, String(j));
46
- else g != null && w.append(R, String(g));
47
- return console.log("[AuditLogAPI] serialized query string:", w.toString()), w.toString();
48
- }
49
- })
50
- );
51
- }
52
- }, wt = { class: "flex h-[46px] items-center gap-8 rounded-sm px-16 hover:bg-fm-color-opacity-sm" }, Mt = { class: "fm-typo-en-body-lg-400 text-fm-color-typo-secondary" }, Ft = {
53
- "data-more-measure": "",
54
- class: "flex h-[46px] items-center gap-8 rounded-sm px-16"
55
- }, It = { class: "fm-typo-en-body-lg-400 text-fm-color-typo-secondary" }, Tt = /* @__PURE__ */ Ee({
56
- __name: "AuditLogModuleTabs",
57
- props: {
58
- modelValue: {},
59
- items: {}
60
- },
61
- emits: ["update:modelValue"],
62
- setup(o, { emit: a }) {
63
- const x = o, T = a, { t: P } = Ae(), I = p(!1), c = p(null), s = p(null), w = p([]), R = p(0), g = p(0);
64
- let j = null;
65
- async function D() {
66
- if (await pt(), !s.value) return;
67
- const f = s.value.querySelectorAll("[data-tab-measure]");
68
- w.value = Array.from(f).map((M) => M.offsetWidth);
69
- const v = s.value.querySelector("[data-more-measure]");
70
- R.value = (v == null ? void 0 : v.offsetWidth) ?? 0;
71
- }
72
- const J = L(() => {
73
- const f = x.items.length;
74
- if (f === 0) return 0;
75
- if (!g.value || w.value.length !== f) return f;
76
- const v = w.value;
77
- if (v.reduce((r, B) => r + B, 0) <= g.value) return f;
78
- const F = R.value;
79
- let z = 0, N = 0;
80
- for (let r = 0; r < f && !(z + v[r] + F > g.value); r++)
81
- z += v[r], N++;
82
- return N;
83
- }), te = L(() => {
84
- const f = J.value, v = x.items.length;
85
- if (f >= v) return [...x.items];
86
- const M = x.items.slice(0, f), F = x.items.find((h) => h.value === x.modelValue);
87
- if (!F || M.some((h) => h.value === F.value)) return M;
88
- if (f === 0) return [F];
89
- const z = x.items.findIndex((h) => h.value === F.value), N = w.value, r = R.value, B = N[z] ?? 0;
90
- let H = f, ne = N.slice(0, H - 1).reduce((h, ae) => h + ae, 0);
91
- for (; H > 1 && ne + B + r > g.value; )
92
- H--, ne = N.slice(0, H - 1).reduce((h, ae) => h + ae, 0);
93
- return [...x.items.slice(0, Math.max(H - 1, 0)), F];
94
- }), $ = L(() => {
95
- const f = new Set(te.value.map((v) => v.value));
96
- return x.items.filter((v) => !f.has(v.value));
97
- });
98
- function U(f) {
99
- I.value = !1, T("update:modelValue", f);
100
- }
101
- return ft(async () => {
102
- await D(), c.value && (g.value = c.value.clientWidth, j = new ResizeObserver(() => {
103
- c.value && (g.value = c.value.clientWidth);
104
- }), j.observe(c.value));
105
- }), vt(() => {
106
- j == null || j.disconnect(), j = null;
107
- }), Q(
108
- () => x.items,
109
- () => {
110
- D();
111
- },
112
- { deep: !0 }
113
- ), (f, v) => {
114
- const M = E("FmTab"), F = E("FmIcon"), z = E("FmMenuItem"), N = E("FmMenu");
115
- return m(), y("div", {
116
- ref_key: "containerRef",
117
- ref: c,
118
- class: "relative flex w-full flex-row items-center"
119
- }, [
120
- (m(!0), y(ee, null, se(te.value, (r) => (m(), oe(M, {
121
- key: r.value,
122
- "model-value": o.modelValue,
123
- label: r.label,
124
- badge: r.badge,
125
- disabled: r.disabled,
126
- value: r.value,
127
- "onUpdate:modelValue": U
128
- }, null, 8, ["model-value", "label", "badge", "disabled", "value"]))), 128)),
129
- $.value.length > 0 ? (m(), oe(N, {
130
- key: 0,
131
- "show-menu": I.value,
132
- class: "max-w-[360px] min-w-[90px] rounded-sm",
133
- placement: "bottom-start",
134
- onMenuChanged: v[0] || (v[0] = (r) => I.value = r)
135
- }, {
136
- "menu-button": Y(() => [
137
- l("div", wt, [
138
- u(F, { name: "more_vert" }),
139
- l("span", Mt, i(n(P)("auditLog.modules.more")), 1)
140
- ])
141
- ]),
142
- default: Y(() => [
143
- (m(!0), y(ee, null, se($.value, (r) => (m(), oe(z, {
144
- key: r.value,
145
- "model-value": o.modelValue === r.value,
146
- label: r.label,
147
- disabled: r.disabled,
148
- onClick: (B) => U(r.value)
149
- }, null, 8, ["model-value", "label", "disabled", "onClick"]))), 128))
150
- ]),
151
- _: 1
152
- }, 8, ["show-menu"])) : V("", !0),
153
- l("div", {
154
- ref_key: "measurerRef",
155
- ref: s,
156
- "aria-hidden": "true",
157
- class: "pointer-events-none invisible absolute -left-[9999px] -top-[9999px] flex flex-row items-center"
158
- }, [
159
- (m(!0), y(ee, null, se(o.items, (r) => (m(), y("div", {
160
- key: `measure-${r.value}`,
161
- "data-tab-measure": ""
162
- }, [
163
- u(M, {
164
- "model-value": o.modelValue,
165
- label: r.label,
166
- badge: r.badge,
167
- disabled: r.disabled,
168
- value: r.value
169
- }, null, 8, ["model-value", "label", "badge", "disabled", "value"])
170
- ]))), 128)),
171
- l("div", Ft, [
172
- u(F, { name: "more_vert" }),
173
- l("span", It, i(n(P)("auditLog.modules.more")), 1)
174
- ])
175
- ], 512)
176
- ], 512);
177
- };
178
- }
179
- }), Dt = St("team", () => {
180
- const o = p([]), a = p(!1), x = L(
181
- () => Object.fromEntries(o.value.map((c) => [c.doc.userId, c.name]))
182
- ), T = L(
183
- () => Object.fromEntries(o.value.map((c) => [c.doc.userId, c.email]))
184
- ), P = L(
185
- () => Object.fromEntries(o.value.map((c) => [c.doc.userId, c.phoneNumber]))
186
- );
187
- async function I({ force: c = !1 } = {}) {
188
- if (!(!c && o.value.length > 0))
189
- try {
190
- a.value = !0;
191
- const s = await Lt.readTeamMembers();
192
- o.value = s.sort((w, R) => w.doc.isOwner ? -1 : w.name.localeCompare(R.name));
193
- } finally {
194
- a.value = !1;
195
- }
196
- }
197
- return {
198
- members: o,
199
- isLoading: a,
200
- userIdToName: x,
201
- userIdToEmail: T,
202
- userIdToPhone: P,
203
- readTeamMembers: I
204
- };
205
- }), Ot = {
206
- class: "flex flex-col gap-4 p-12 w-[260px]"
207
- }, Vt = {
208
- class: "text-xs font-semibold text-fm-color-typo-secondary mb-4"
209
- }, Pt = {
210
- class: "flex min-h-0 flex-1 flex-col gap-16"
211
- }, jt = {
212
- class: "space-y-16"
213
- }, Ct = {
214
- class: "flex flex-wrap items-center gap-8"
215
- }, Et = {
216
- class: "w-fit"
217
- }, At = {
218
- key: 0,
219
- class: "w-fit"
220
- }, Rt = {
221
- class: "w-fit"
222
- }, Ut = {
223
- class: "w-fit"
224
- }, Nt = {
225
- class: "flex h-full flex-col"
226
- }, $t = {
227
- key: 0,
228
- class: "flex shrink-0 items-center justify-end border-t border-fm-color-border-default py-4"
229
- }, Yt = {
230
- class: "text-sm text-fm-color-typo-secondary"
231
- }, zt = {
232
- key: 0,
233
- class: "space-y-12 p-4 text-sm"
234
- }, Bt = {
235
- class: "flex items-start justify-between gap-8 rounded-lg border border-fm-color-border-default p-12"
236
- }, Kt = {
237
- class: "min-w-0 flex-1"
238
- }, qt = {
239
- class: "audit-log-operation-label-detail text-base font-bold leading-snug text-fm-color-typo-primary"
240
- }, Ht = {
241
- class: "rounded-lg border border-fm-color-border-default p-12"
242
- }, Wt = {
243
- class: "space-y-12"
244
- }, Jt = {
245
- class: "text-xs text-fm-color-typo-secondary"
246
- }, Gt = {
247
- class: "font-semibold"
248
- }, Xt = {
249
- class: "text-xs text-fm-color-typo-secondary"
250
- }, Zt = {
251
- class: "font-semibold"
252
- }, Qt = {
253
- class: "text-xs text-fm-color-typo-secondary"
254
- }, ea = {
255
- class: "break-all font-semibold"
256
- }, ta = {
257
- class: "text-xs text-fm-color-typo-secondary"
258
- }, aa = {
259
- class: "font-semibold"
260
- }, la = {
261
- key: 0
262
- }, oa = {
263
- class: "text-xs text-fm-color-typo-secondary"
264
- }, sa = {
265
- class: "break-all font-mono text-xs font-semibold"
266
- }, na = {
267
- class: "text-xs text-fm-color-typo-secondary"
268
- }, ia = {
269
- class: "break-all font-mono text-xs font-semibold"
270
- }, ra = {
271
- class: "text-xs text-fm-color-typo-secondary"
272
- }, ua = {
273
- class: "font-semibold"
274
- }, da = {
275
- key: 0,
276
- class: "rounded-lg border border-fm-color-border-default"
277
- }, ca = {
278
- class: "p-12"
279
- }, ma = {
280
- class: "text-base font-bold text-fm-color-typo-primary"
281
- }, fa = {
282
- class: "space-y-12 p-12"
283
- }, va = {
284
- class: "text-xs text-fm-color-typo-secondary"
285
- }, pa = {
286
- class: "font-semibold"
287
- }, ba = {
288
- class: "rounded-lg border border-fm-color-border-default"
289
- }, ga = {
290
- class: "p-12"
291
- }, ha = {
292
- class: "text-base font-bold text-fm-color-typo-primary"
293
- }, ya = {
294
- class: "space-y-12 p-12"
295
- }, _a = {
296
- class: "text-xs text-fm-color-typo-secondary"
297
- }, xa = {
298
- class: "font-semibold"
299
- }, La = {
300
- key: 0
301
- }, Sa = {
302
- class: "text-xs text-fm-color-typo-secondary"
303
- }, ka = {
304
- key: 0,
305
- class: "font-semibold"
306
- }, wa = {
307
- key: 1,
308
- class: "break-all font-mono text-xs text-fm-color-typo-secondary"
309
- }, Ma = {
310
- key: 1
311
- }, Fa = {
312
- class: "text-xs text-fm-color-typo-secondary"
313
- }, Ia = {
314
- class: "font-semibold whitespace-pre-line"
315
- }, Ta = {
316
- class: "text-xs text-fm-color-typo-secondary"
317
- }, Da = {
318
- class: "font-semibold"
319
- }, Oa = {
320
- class: "text-xs text-fm-color-typo-secondary"
321
- }, Va = {
322
- class: "break-all font-mono text-xs font-semibold"
323
- }, Pa = {
324
- key: 2
325
- }, ja = {
326
- class: "text-xs text-fm-color-typo-secondary"
327
- }, Ca = {
328
- class: "mt-4 space-y-4"
329
- }, Ea = {
330
- class: "flex h-16 w-16 shrink-0 items-center justify-center rounded-full bg-fm-color-primary-default text-xs font-bold text-white"
331
- }, Aa = {
332
- class: "text-xs font-semibold"
333
- }, Ra = {
334
- key: 0,
335
- class: "text-fm-color-typo-secondary"
336
- }, Ua = {
337
- key: 3
338
- }, Na = {
339
- class: "text-xs text-fm-color-typo-secondary"
340
- }, $a = {
341
- class: "mt-4 max-h-[400px] overflow-auto rounded bg-gray-100 p-8 font-mono text-xs leading-relaxed shadow-inner whitespace-pre-wrap break-all"
342
- }, he = 100, ye = 1e3, Ya = "YYYY-MM-DD HH:mm", O = "YYYY-MM-DD", Ce = "audit-log-export-fields", al = /* @__PURE__ */ Ee({
343
- __name: "AuditLogList",
344
- setup(o) {
345
- const {
346
- t: a
347
- } = Ae(), x = bt(), T = Dt(), P = p(!1), I = p(!1), c = p([]), s = p(null), w = p(!1);
348
- async function R(e) {
349
- const t = Uint8Array.from(atob(e), (S) => S.charCodeAt(0)), b = new DecompressionStream("gzip"), k = b.writable.getWriter();
350
- return await k.write(t), await k.close(), new Response(b.readable).text();
351
- }
352
- const g = p("");
353
- let j = 0;
354
- Q(() => {
355
- var e, t;
356
- return (t = (e = s.value) == null ? void 0 : e.metadata) == null ? void 0 : t.requestBody;
357
- }, async (e) => {
358
- const t = ++j;
359
- if (!e) {
360
- g.value = "";
361
- return;
362
- }
363
- if (typeof e == "object") {
364
- g.value = JSON.stringify(e, null, 2);
365
- return;
366
- }
367
- if (e.startsWith("gzip:")) {
368
- try {
369
- const b = await R(e.slice(5));
370
- if (t !== j) return;
371
- g.value = JSON.stringify(JSON.parse(b), null, 2);
372
- } catch {
373
- if (t !== j) return;
374
- g.value = e;
375
- }
376
- return;
377
- }
378
- try {
379
- g.value = JSON.stringify(JSON.parse(e), null, 2);
380
- } catch {
381
- g.value = e;
382
- }
383
- }, {
384
- immediate: !0
385
- });
386
- const D = p(1), J = p(!1), te = _().format("YYYY-MM-DD"), $ = p({
387
- startDate: `${te} 00:00`,
388
- endDate: `${te} 23:59`
389
- }), U = p(), f = p(), v = p(), M = p(), F = p("all");
390
- function z(e) {
391
- return typeof e == "string" ? [e] : Array.isArray(e) ? e.filter((t) => typeof t == "string") : [];
392
- }
393
- const N = L(() => ge.map(({
394
- key: e
395
- }) => ({
396
- label: a(`auditLog.modules.${e}`),
397
- value: e
398
- }))), r = L(() => ge.find((e) => e.key === F.value) ?? ge[0]), B = L(() => F.value === "all"), H = L(() => T.members.map((e) => ({
399
- label: e.name,
400
- value: e.doc.userId
401
- }))), ne = L(() => {
402
- const e = Pe.flatMap((S) => z(S.subject).map((A) => ({
403
- label: S.label,
404
- value: A
405
- }))), t = Object.entries(Oe).map(([S, A]) => ({
406
- label: A,
407
- value: S
408
- })), b = /* @__PURE__ */ new Set(), k = [];
409
- for (const S of [...e, ...t])
410
- b.has(S.value) || (b.add(S.value), k.push(S));
411
- return k;
412
- });
413
- function _e(e, t) {
414
- const b = t.toLowerCase();
415
- return e.label.toLowerCase().includes(b) || e.value.replace(/^business::/, "").toLowerCase().includes(b) ? !0 : e.value.toLowerCase().includes(b);
416
- }
417
- const h = L(() => ({
418
- manage: a("auditLog.action.manage"),
419
- create: a("auditLog.action.create"),
420
- read: a("auditLog.action.read"),
421
- update: a("auditLog.action.update"),
422
- delete: a("auditLog.action.delete")
423
- })), ae = L(() => [{
424
- label: h.value.manage,
425
- value: "manage"
426
- }, {
427
- label: h.value.create,
428
- value: "create"
429
- }, {
430
- label: h.value.read,
431
- value: "read"
432
- }, {
433
- label: h.value.update,
434
- value: "update"
435
- }, {
436
- label: h.value.delete,
437
- value: "delete"
438
- }]), ie = L(() => ({
439
- allowed: a("auditLog.outcome.success"),
440
- denied: a("auditLog.outcome.failed"),
441
- skipped: a("auditLog.outcome.skipped")
442
- })), Re = L(() => [{
443
- label: ie.value.allowed,
444
- value: "allowed"
445
- }, {
446
- label: ie.value.denied,
447
- value: "denied"
448
- }, {
449
- label: ie.value.skipped,
450
- value: "skipped"
451
- }]), Ue = L(() => ({
452
- admin: a("auditLog.detail.resolvedFromValue.admin"),
453
- staff: a("auditLog.detail.resolvedFromValue.staff"),
454
- permissionSet: a("auditLog.detail.resolvedFromValue.permissionSet"),
455
- systemPermissionSet: a("auditLog.detail.resolvedFromValue.systemPermissionSet"),
456
- custom: a("auditLog.detail.resolvedFromValue.custom"),
457
- "no-match": a("auditLog.detail.resolvedFromValue.noMatch"),
458
- unknown: a("auditLog.detail.resolvedFromValue.unknown")
459
- })), Ne = L(() => ({
460
- GET: h.value.read,
461
- POST: h.value.create,
462
- PUT: h.value.update,
463
- PATCH: h.value.update,
464
- DELETE: h.value.delete
465
- })), xe = {
466
- allowed: "success",
467
- denied: "critical",
468
- skipped: "warning"
469
- }, $e = L(() => {
470
- const {
471
- startDate: e,
472
- endDate: t
473
- } = $.value;
474
- return e && t ? `${e} – ${t}` : e || t || a("auditLog.dateRange.placeholder");
475
- }), Ye = L(() => [{
476
- label: a("date.predefinedRanges.today"),
477
- value: {
478
- startDate: _().format(O),
479
- endDate: _().format(O)
480
- }
481
- }, {
482
- label: a("date.predefinedRanges.yesterday"),
483
- value: {
484
- startDate: _().subtract(1, "day").format(O),
485
- endDate: _().subtract(1, "day").format(O)
486
- }
487
- }, {
488
- label: a("date.predefinedRanges.thisWeek"),
489
- value: {
490
- startDate: _().startOf("week").format(O),
491
- endDate: _().endOf("week").format(O)
492
- }
493
- }, {
494
- label: a("date.predefinedRanges.lastWeek"),
495
- value: {
496
- startDate: _().subtract(1, "week").startOf("week").format(O),
497
- endDate: _().subtract(1, "week").endOf("week").format(O)
498
- }
499
- }, {
500
- label: a("date.predefinedRanges.last7Days"),
501
- value: {
502
- startDate: _().subtract(7, "day").format(O),
503
- endDate: _().subtract(1, "day").format(O)
504
- }
505
- }, {
506
- label: a("date.predefinedRanges.thisMonth"),
507
- value: {
508
- startDate: _().startOf("month").format(O),
509
- endDate: _().endOf("month").format(O)
510
- }
511
- }, {
512
- label: a("date.predefinedRanges.lastMonth"),
513
- value: {
514
- startDate: _().subtract(1, "month").startOf("month").format(O),
515
- endDate: _().subtract(1, "month").endOf("month").format(O)
516
- }
517
- }]);
518
- function me(e) {
519
- var t;
520
- return ((t = Pe.find((b) => b.subject === e)) == null ? void 0 : t.label) ?? Oe[e];
521
- }
522
- function re(e) {
523
- return T.userIdToName[e.userId] || e.userId;
524
- }
525
- function Le(e) {
526
- return T.userIdToPhone[e.userId] || "-";
527
- }
528
- function ze(e) {
529
- return T.userIdToEmail[e.userId] || "-";
530
- }
531
- function Se(e) {
532
- return _(e).format("DD MMM YYYY, HH:mm");
533
- }
534
- function Be(e) {
535
- return _(e).format("DD MMM YYYY, HH:mm:ss").toUpperCase();
536
- }
537
- function ke(e) {
538
- return h.value[e] ?? e;
539
- }
540
- function fe(e) {
541
- return e.metadata.operationLabel ?? ke(e.action);
542
- }
543
- function ve(e) {
544
- return ie.value[e];
545
- }
546
- function Ke(e) {
547
- return Ue.value[e] ?? e;
548
- }
549
- function qe(e) {
550
- return e.metadata.requestMethod ? Ne.value[e.metadata.requestMethod] ?? e.metadata.requestMethod : ke(e.action);
551
- }
552
- function we(e) {
553
- const t = String(e ?? "");
554
- return `"${(/^[=+\-@\t\r]/.test(t) ? `'${t}` : t).replace(/"/g, '""')}"`;
555
- }
556
- const pe = [{
557
- key: "timestamp",
558
- labelKey: "auditLog.exportFields.timestamp",
559
- getValue: (e) => Se(e.timestamp),
560
- defaultSelected: !0
561
- }, {
562
- key: "userName",
563
- labelKey: "auditLog.exportFields.userName",
564
- getValue: (e) => re(e),
565
- defaultSelected: !0
566
- }, {
567
- key: "userPhone",
568
- labelKey: "auditLog.exportFields.userPhone",
569
- getValue: (e) => Le(e),
570
- defaultSelected: !0
571
- }, {
572
- key: "subject",
573
- labelKey: "auditLog.exportFields.subject",
574
- getValue: (e) => me(e.subject) ?? e.subject,
575
- defaultSelected: !0
576
- }, {
577
- key: "action",
578
- labelKey: "auditLog.exportFields.action",
579
- getValue: (e) => e.action,
580
- defaultSelected: !0
581
- }, {
582
- key: "operation",
583
- labelKey: "auditLog.exportFields.operation",
584
- getValue: (e) => fe(e),
585
- defaultSelected: !0
586
- }, {
587
- key: "outcome",
588
- labelKey: "auditLog.exportFields.outcome",
589
- getValue: (e) => ve(e.outcome),
590
- defaultSelected: !0
591
- }, {
592
- key: "businessId",
593
- labelKey: "auditLog.exportFields.businessId",
594
- getValue: (e) => e.businessId,
595
- defaultSelected: !1
596
- }, {
597
- key: "restaurantId",
598
- labelKey: "auditLog.exportFields.restaurantId",
599
- getValue: (e) => e.restaurantId,
600
- defaultSelected: !1
601
- }, {
602
- key: "country",
603
- labelKey: "auditLog.exportFields.country",
604
- getValue: (e) => e.country,
605
- defaultSelected: !1
606
- }, {
607
- key: "resolvedFrom",
608
- labelKey: "auditLog.exportFields.resolvedFrom",
609
- getValue: (e) => {
610
- var t;
611
- return (t = e.metadata) == null ? void 0 : t.resolvedFrom;
612
- },
613
- defaultSelected: !1
614
- }, {
615
- key: "requestMethod",
616
- labelKey: "auditLog.exportFields.requestMethod",
617
- getValue: (e) => {
618
- var t;
619
- return (t = e.metadata) == null ? void 0 : t.requestMethod;
620
- },
621
- defaultSelected: !1
622
- }, {
623
- key: "requestPath",
624
- labelKey: "auditLog.exportFields.requestPath",
625
- getValue: (e) => {
626
- var t;
627
- return (t = e.metadata) == null ? void 0 : t.requestPath;
628
- },
629
- defaultSelected: !1
630
- }];
631
- function He() {
632
- try {
633
- const e = localStorage.getItem(Ce);
634
- if (e) {
635
- const t = JSON.parse(e);
636
- if (Array.isArray(t) && t.length > 0) return new Set(t);
637
- }
638
- } catch {
639
- }
640
- return new Set(pe.filter((e) => e.defaultSelected).map((e) => e.key));
641
- }
642
- const G = p(He());
643
- function We(e) {
644
- const t = new Set(G.value);
645
- if (t.has(e)) {
646
- if (t.size <= 1) return;
647
- t.delete(e);
648
- } else
649
- t.add(e);
650
- G.value = t;
651
- try {
652
- localStorage.setItem(Ce, JSON.stringify([...t]));
653
- } catch {
654
- }
655
- }
656
- async function Je() {
657
- var e, t, b, k, S, A;
658
- if (!I.value) {
659
- I.value = !0;
660
- try {
661
- const {
662
- startDate: K,
663
- endDate: q
664
- } = $.value, W = r.value.subjectPrefixes, de = (/* @__PURE__ */ new Date()).toISOString().slice(0, 19).replace("T", " "), d = q ? ue(q) : null, Z = d && d < de ? d : de, tt = {
665
- ...K ? {
666
- from: ue(K)
667
- } : {},
668
- to: Z,
669
- ...(e = U.value) != null && e.length ? {
670
- userIds: U.value
671
- } : {},
672
- ...B.value && ((t = f.value) != null && t.length) ? {
673
- subjects: f.value
674
- } : {},
675
- ...W.length ? {
676
- subjectPrefixes: [...W]
677
- } : {},
678
- ...(b = M.value) != null && b.length ? {
679
- actions: M.value
680
- } : {},
681
- ...(k = v.value) != null && k.length ? {
682
- outcomes: v.value
683
- } : {}
684
- }, Me = [];
685
- let Fe = 0;
686
- for (; ; ) {
687
- const C = await je.read({
688
- ...tt,
689
- limit: ye,
690
- offset: Fe
691
- });
692
- if (Me.push(...C), C.length < ye) break;
693
- Fe += ye;
694
- }
695
- const Ie = pe.filter((C) => G.value.has(C.key)), at = Ie.map((C) => a(C.labelKey)), lt = Me.map((C) => Ie.map((mt) => mt.getValue(C) ?? "")), be = -(/* @__PURE__ */ new Date()).getTimezoneOffset(), ot = be >= 0 ? "+" : "-", st = String(Math.floor(Math.abs(be) / 60)).padStart(2, "0"), nt = String(Math.abs(be) % 60).padStart(2, "0"), it = `UTC${ot}${st}:${nt}`, Te = ((S = x.currentBusiness.value) == null ? void 0 : S.name) || "", rt = [K, q].filter(Boolean).join(" – "), ut = [...[[a("auditLog.title")], [`${a("auditLog.frontMatter.date")}: ${rt}`], ...Te ? [[`${a("auditLog.frontMatter.business")}: ${Te}`]] : [], [`${a("auditLog.frontMatter.generatedBy")}: ${_().format("DD MMM YYYY, HH:mm")} (${it})`], []].map((C) => C.map(we).join(",")), ...[at, ...lt].map((C) => C.map(we).join(","))].join(`
696
- `), dt = `audit-log_${(((A = x.currentBusiness.value) == null ? void 0 : A.name) || "business").replace(/[^a-z0-9_-]+/gi, "_")}_${_().format("YYYYMMDD_HHmmss")}.csv`, ct = new Blob([`\uFEFF${ut}`], {
697
- type: "text/csv;charset=utf-8;"
698
- }), De = window.URL.createObjectURL(ct), le = document.createElement("a");
699
- le.href = De, le.download = dt, document.body.appendChild(le), le.click(), le.remove(), window.URL.revokeObjectURL(De);
700
- } finally {
701
- I.value = !1;
702
- }
703
- }
704
- }
705
- const Ge = [{
706
- accessorKey: "timestamp",
707
- header: () => a("auditLog.columns.timestamp"),
708
- cell(e) {
709
- return Se(e.row.original.timestamp);
710
- }
711
- }, {
712
- accessorKey: "userId",
713
- header: () => a("auditLog.columns.user"),
714
- enableSorting: !1,
715
- size: 220,
716
- cell(e) {
717
- const t = e.row.original;
718
- return u("div", {
719
- class: "flex items-center gap-8"
720
- }, [u(Ve.FmAvatar, {
721
- initials: re(t),
722
- size: "sm",
723
- class: "shrink-0"
724
- }, null), u("div", {
725
- class: "min-w-0"
726
- }, [u("p", {
727
- class: "truncate font-semibold"
728
- }, [re(t)]), u("p", {
729
- class: "truncate text-fm-color-typo-secondary"
730
- }, [Le(t)])])]);
731
- }
732
- }, {
733
- accessorKey: "subject",
734
- header: () => a("auditLog.columns.role"),
735
- meta: {
736
- cellClass: "text-left"
737
- },
738
- cell(e) {
739
- const t = e.row.original;
740
- return u("div", {
741
- class: "text-left"
742
- }, [me(t.subject) ?? t.subject]);
743
- }
744
- }, {
745
- accessorKey: "action",
746
- header: () => a("auditLog.columns.action"),
747
- enableSorting: !1,
748
- size: 280,
749
- meta: {
750
- cellSpanClass: "audit-log-action-label"
751
- },
752
- cell(e) {
753
- return fe(e.row.original);
754
- }
755
- }, {
756
- accessorKey: "outcome",
757
- header: () => a("auditLog.columns.outcome"),
758
- enableSorting: !1,
759
- cell(e) {
760
- const t = e.row.original;
761
- return u(Ve.FmChip, {
762
- variant: xe[t.outcome] ?? "neutral",
763
- label: ve(t.outcome),
764
- compact: !0
765
- }, null);
766
- }
767
- }];
768
- function ue(e) {
769
- const t = _(e, Ya);
770
- return new Date(t.year(), t.month(), t.date(), t.hour(), t.minute(), 0).toISOString().slice(0, 19).replace("T", " ");
771
- }
772
- async function X() {
773
- var e, t, b, k;
774
- P.value = !0;
775
- try {
776
- const {
777
- startDate: S,
778
- endDate: A
779
- } = $.value, K = (D.value - 1) * he, q = r.value.subjectPrefixes, W = await je.read({
780
- limit: he,
781
- offset: K,
782
- ...S ? {
783
- from: ue(S)
784
- } : {},
785
- ...A ? {
786
- to: ue(A)
787
- } : {},
788
- ...(e = U.value) != null && e.length ? {
789
- userIds: U.value
790
- } : {},
791
- ...B.value && ((t = f.value) != null && t.length) ? {
792
- subjects: f.value
793
- } : {},
794
- ...q.length ? {
795
- subjectPrefixes: [...q]
796
- } : {},
797
- ...(b = M.value) != null && b.length ? {
798
- actions: M.value
799
- } : {},
800
- ...(k = v.value) != null && k.length ? {
801
- outcomes: v.value
802
- } : {}
803
- });
804
- c.value = W, J.value = W.length === he;
805
- } finally {
806
- P.value = !1;
807
- }
808
- }
809
- Q($, () => {
810
- D.value = 1, X();
811
- }), Q([U, f, v, M], () => {
812
- D.value = 1, X();
813
- }), Q(F, () => {
814
- D.value = 1, X();
815
- });
816
- async function Xe() {
817
- D.value > 1 && (D.value--, await X());
818
- }
819
- async function Ze() {
820
- J.value && (D.value++, await X());
821
- }
822
- function Qe(e) {
823
- s.value = e, w.value = !0;
824
- }
825
- function et() {
826
- w.value = !1, s.value = null;
827
- }
828
- return Q(x.currentBusiness, (e) => {
829
- e && (D.value = 1, T.readTeamMembers(), X());
830
- }, {
831
- immediate: !0
832
- }), (e, t) => {
833
- const b = E("FmSpacer"), k = E("FmButton"), S = E("FmMenuItem"), A = E("FmMenu"), K = E("FmChip"), q = E("FmDateRangePicker"), W = E("FmTable"), de = E("FmSideSheet");
834
- return m(), y(ee, null, [u(_t, {
835
- heading: n(a)("auditLog.title")
836
- }, {
837
- "append-heading": Y(() => [u(b), u(k, {
838
- variant: "primary",
839
- "prepend-icon": "upload",
840
- label: n(a)("auditLog.export"),
841
- disabled: c.value.length === 0 || I.value || n(T).isLoading || n(T).members.length === 0,
842
- loading: I.value,
843
- onClick: Je
844
- }, null, 8, ["label", "disabled", "loading"]), u(A, {
845
- "close-on-click": !1,
846
- "z-index": 50
847
- }, {
848
- "menu-button": Y(() => [u(k, {
849
- variant: "tertiary",
850
- icon: "settings",
851
- "aria-label": n(a)("auditLog.exportSettings.title"),
852
- disabled: I.value
853
- }, null, 8, ["aria-label", "disabled"])]),
854
- default: Y(() => [l("div", Ot, [l("p", Vt, i(n(a)("auditLog.exportSettings.title")), 1), (m(), y(ee, null, se(pe, (d) => u(S, {
855
- key: d.key,
856
- label: n(a)(d.labelKey),
857
- "has-checkbox": "",
858
- "model-value": G.value.has(d.key),
859
- disabled: G.value.has(d.key) && G.value.size === 1,
860
- onClick: (Z) => We(d.key)
861
- }, null, 8, ["label", "model-value", "disabled", "onClick"])), 64))])]),
862
- _: 1
863
- })]),
864
- default: Y(() => [l("div", Pt, [l("div", jt, [u(Tt, {
865
- modelValue: F.value,
866
- "onUpdate:modelValue": t[0] || (t[0] = (d) => F.value = d),
867
- items: N.value
868
- }, null, 8, ["modelValue", "items"]), l("div", Ct, [u(q, {
869
- modelValue: $.value,
870
- "onUpdate:modelValue": t[1] || (t[1] = (d) => $.value = d),
871
- "show-predefined-range": "",
872
- "show-time": "",
873
- "predefined-range": Ye.value
874
- }, {
875
- "trigger-button": Y(() => [u(K, {
876
- label: $e.value,
877
- icon: "calendar_month"
878
- }, null, 8, ["label"])]),
879
- _: 1
880
- }, 8, ["modelValue", "predefined-range"]), l("div", Et, [u(ce, {
881
- modelValue: U.value,
882
- "onUpdate:modelValue": t[2] || (t[2] = (d) => U.value = d),
883
- items: H.value,
884
- multiple: "",
885
- variant: "dark",
886
- placeholder: n(a)("auditLog.filter.user_placeholder"),
887
- "selected-prefix": n(a)("auditLog.filter.selected_user_prefix"),
888
- "chip-icon": "account_circle"
889
- }, null, 8, ["modelValue", "items", "placeholder", "selected-prefix"])]), B.value ? (m(), y("div", At, [u(ce, {
890
- modelValue: f.value,
891
- "onUpdate:modelValue": t[3] || (t[3] = (d) => f.value = d),
892
- items: ne.value,
893
- "filter-fn": _e,
894
- multiple: "",
895
- variant: "dark",
896
- placeholder: n(a)("auditLog.filter.subject_placeholder"),
897
- "selected-prefix": n(a)("auditLog.filter.selected_subject_prefix"),
898
- "chip-icon": "badge"
899
- }, null, 8, ["modelValue", "items", "placeholder", "selected-prefix"])])) : V("", !0), l("div", Rt, [u(ce, {
900
- modelValue: M.value,
901
- "onUpdate:modelValue": t[4] || (t[4] = (d) => M.value = d),
902
- items: ae.value,
903
- multiple: "",
904
- variant: "dark",
905
- placeholder: n(a)("auditLog.filter.action_placeholder"),
906
- "selected-prefix": n(a)("auditLog.filter.selected_action_prefix"),
907
- searchable: !1
908
- }, null, 8, ["modelValue", "items", "placeholder", "selected-prefix"])]), l("div", Ut, [u(ce, {
909
- modelValue: v.value,
910
- "onUpdate:modelValue": t[5] || (t[5] = (d) => v.value = d),
911
- items: Re.value,
912
- multiple: "",
913
- variant: "dark",
914
- placeholder: n(a)("auditLog.filter.status_placeholder"),
915
- "selected-prefix": n(a)("auditLog.filter.selected_status_prefix"),
916
- searchable: !1,
917
- "chip-icon": "check_circle"
918
- }, null, 8, ["modelValue", "items", "placeholder", "selected-prefix"])])])]), !P.value && c.value.length === 0 ? (m(), oe(n(xt), {
919
- key: 0,
920
- title: n(a)("auditLog.noData.title"),
921
- subtitle: n(a)("auditLog.noData.subtitle")
922
- }, null, 8, ["title", "subtitle"])) : (m(), oe(gt, {
923
- key: 1
924
- }, {
925
- default: Y(() => [l("div", Nt, [u(W, {
926
- "column-defs": Ge,
927
- "row-data": c.value,
928
- "page-size": c.value.length,
929
- loading: P.value,
930
- "pin-header-row": "",
931
- "hide-footer": "",
932
- class: "min-h-0 flex-1 cursor-pointer",
933
- onRowClick: t[6] || (t[6] = (d) => Qe(d.original))
934
- }, null, 8, ["row-data", "page-size", "loading"]), D.value > 1 || J.value ? (m(), y("div", $t, [u(k, {
935
- variant: "tertiary",
936
- icon: "chevron_left",
937
- disabled: D.value === 1,
938
- "aria-label": n(a)("auditLog.pagination.prevPage"),
939
- onClick: Xe
940
- }, null, 8, ["disabled", "aria-label"]), l("span", Yt, i(n(a)("auditLog.pagination.page", {
941
- page: D.value
942
- })), 1), u(k, {
943
- variant: "tertiary",
944
- icon: "chevron_right",
945
- disabled: !J.value,
946
- "aria-label": n(a)("auditLog.pagination.nextPage"),
947
- onClick: Ze
948
- }, null, 8, ["disabled", "aria-label"])])) : V("", !0)])]),
949
- _: 1
950
- }))])]),
951
- _: 1
952
- }, 8, ["heading"]), u(de, {
953
- header: n(a)("auditLog.detail.header"),
954
- "model-value": w.value,
955
- "max-width": 480,
956
- "dismiss-away": "",
957
- "onUpdate:modelValue": t[7] || (t[7] = (d) => {
958
- d || et();
959
- })
960
- }, {
961
- default: Y(() => [s.value ? (m(), y("div", zt, [l("div", Bt, [l("div", Kt, [l("p", qt, i(fe(s.value)), 1)]), u(K, {
962
- variant: xe[s.value.outcome] ?? "neutral",
963
- label: ve(s.value.outcome),
964
- compact: ""
965
- }, null, 8, ["variant", "label"])]), l("div", Ht, [l("div", Wt, [l("div", null, [l("p", Jt, i(n(a)("auditLog.detail.date")), 1), l("p", Gt, i(Be(s.value.timestamp)), 1)]), l("div", null, [l("p", Xt, i(n(a)("auditLog.detail.user")), 1), l("p", Zt, i(re(s.value)), 1)]), l("div", null, [l("p", Qt, i(n(a)("auditLog.detail.email")), 1), l("p", ea, i(ze(s.value)), 1)]), l("div", null, [l("p", ta, i(n(a)("auditLog.detail.role")), 1), l("p", aa, i(me(s.value.subject) || s.value.subject), 1)]), s.value.field ? (m(), y("div", la, [l("p", oa, i(n(a)("auditLog.detail.field")), 1), l("p", sa, i(s.value.field), 1)])) : V("", !0), l("div", null, [l("p", na, i(n(a)("auditLog.detail.business")), 1), l("p", ia, i(s.value.businessId || "-"), 1)]), l("div", null, [l("p", ra, i(n(a)("auditLog.detail.restaurant")), 1), l("p", ua, i(s.value.restaurantId || "-"), 1)])])]), s.value.metadata.operationLabel ? (m(), y("div", da, [l("div", ca, [l("p", ma, i(n(a)("auditLog.detail.changeDetails")), 1)]), t[8] || (t[8] = l("hr", {
966
- class: "border-fm-color-border-default"
967
- }, null, -1)), l("div", fa, [l("div", null, [l("p", va, i(n(a)("auditLog.detail.eventType")), 1), l("p", pa, i(s.value.metadata.operationLabel), 1)])])])) : V("", !0), l("div", ba, [l("div", ga, [l("p", ha, i(n(a)("auditLog.detail.metadata")), 1)]), t[9] || (t[9] = l("hr", {
968
- class: "border-fm-color-border-default"
969
- }, null, -1)), l("div", ya, [l("div", null, [l("p", _a, i(n(a)("auditLog.detail.resolvedFrom")), 1), l("p", xa, i(Ke(s.value.metadata.resolvedFrom)), 1)]), (s.value.metadata.resolvedFrom === "permissionSet" || s.value.metadata.resolvedFrom === "systemPermissionSet") && (s.value.metadata.permissionSetName || s.value.metadata.permissionSetId) ? (m(), y("div", La, [l("p", Sa, i(n(a)("auditLog.detail.permissionSet")), 1), s.value.metadata.permissionSetName ? (m(), y("p", ka, i(s.value.metadata.permissionSetName), 1)) : V("", !0), s.value.metadata.permissionSetId ? (m(), y("p", wa, i(s.value.metadata.permissionSetId), 1)) : V("", !0)])) : V("", !0), s.value.metadata.reason ? (m(), y("div", Ma, [l("p", Fa, i(n(a)("auditLog.detail.reason")), 1), l("p", Ia, i(s.value.metadata.reason), 1)])) : V("", !0), l("div", null, [l("p", Ta, i(n(a)("auditLog.detail.requestMethod")), 1), l("p", Da, i(qe(s.value)), 1)]), l("div", null, [l("p", Oa, i(n(a)("auditLog.detail.requestPath")), 1), l("p", Va, i(s.value.metadata.requestPath || "-"), 1)]), s.value.metadata.trace && s.value.metadata.trace.length > 0 ? (m(), y("div", Pa, [l("p", ja, i(n(a)("auditLog.detail.permissionTrace")), 1), l("ol", Ca, [(m(!0), y(ee, null, se(s.value.metadata.trace, (d, Z) => (m(), y("li", {
970
- key: Z,
971
- class: "flex items-center gap-6"
972
- }, [l("span", Ea, i(Z + 1), 1), l("span", Aa, i(d), 1), Z < s.value.metadata.trace.length - 1 ? (m(), y("span", Ra, "→")) : V("", !0)]))), 128))])])) : V("", !0), g.value ? (m(), y("div", Ua, [l("p", Na, i(n(a)("auditLog.detail.requestBody")), 1), l("pre", $a, i(g.value), 1)])) : V("", !0)])])])) : V("", !0)]),
973
- _: 1
974
- }, 8, ["header", "model-value"])], 64);
975
- };
976
- }
977
- });
978
- export {
979
- al as default
980
- };