@wssto2/vue-core 0.9.4 → 0.10.0

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 (160) hide show
  1. package/CHANGELOG.md +24 -0
  2. package/dist/ActionRow.vue_vue_type_script_setup_true_lang-IpcP3Bjc.js +87 -0
  3. package/dist/Activity-CeAG0ZtJ.js +169 -0
  4. package/dist/{AdaptivePageShell.vue_vue_type_script_setup_true_lang-DdJOodn8.js → AdaptivePageShell.vue_vue_type_script_setup_true_lang-D5i77H6S.js} +147 -159
  5. package/dist/{AsyncSection.vue_vue_type_script_setup_true_lang-BdeOKqz_.js → AsyncSection.vue_vue_type_script_setup_true_lang-DGzQ-Snp.js} +1 -1
  6. package/dist/BottomDockPortal.vue_vue_type_script_setup_true_lang-DmwR-2SP.js +17 -0
  7. package/dist/Button.vue_vue_type_script_setup_true_lang-C74hcb0N.js +123 -0
  8. package/dist/Changes-B9-zpDxG.js +69 -0
  9. package/dist/{CollectionPage.vue_vue_type_script_setup_true_lang-DHcekGNn.js → CollectionPage.vue_vue_type_script_setup_true_lang-Cn0YOWJF.js} +19 -18
  10. package/dist/{DataTable.vue_vue_type_script_setup_true_lang-8kBsNRuq.js → DataTable.vue_vue_type_script_setup_true_lang-BQRG8bpH.js} +1 -1
  11. package/dist/{DateField.vue_vue_type_script_setup_true_lang-BhKdCVFn.js → DateField.vue_vue_type_script_setup_true_lang-CeNwBbJT.js} +1 -1
  12. package/dist/{DeadLetters-Bb5pPlOY.js → DeadLetters-BP03yC4R.js} +5 -6
  13. package/dist/DrawnCheck.vue_vue_type_script_setup_true_lang-9DzDJlIA.js +38 -0
  14. package/dist/FormGroup.vue_vue_type_script_setup_true_lang-D6jYfNjW.js +427 -0
  15. package/dist/{FormView.vue_vue_type_script_setup_true_lang-aaNnMIOi.js → FormView.vue_vue_type_script_setup_true_lang-DvbPEiNQ.js} +2 -2
  16. package/dist/{General-BAG7S6wV.js → General-BDmCJr3H.js} +35 -38
  17. package/dist/{IncidentRecord-D8aOpNHo.js → IncidentRecord-DEhl6AyA.js} +14 -15
  18. package/dist/{IncidentsList-C0cFl0Db.js → IncidentsList-COgRPdk3.js} +3 -3
  19. package/dist/{Modal.vue_vue_type_script_setup_true_lang-BlHhdmMy.js → Modal.vue_vue_type_script_setup_true_lang-DDS0iEnn.js} +9 -8
  20. package/dist/{NewRolePage-C6Iu-EQJ.js → NewRolePage-DhGFwvk3.js} +4 -4
  21. package/dist/{NumberField.vue_vue_type_script_setup_true_lang-TGGAq8J-.js → NumberField.vue_vue_type_script_setup_true_lang-B3UrXNqH.js} +1 -1
  22. package/dist/{PersonAccess.vue_vue_type_script_setup_true_lang-qz1tmYpF.js → PersonAccess.vue_vue_type_script_setup_true_lang-DbGZSNQc.js} +56 -56
  23. package/dist/ProfilePage-BQCK2w8R.js +684 -0
  24. package/dist/ProgressTrack.vue_vue_type_script_setup_true_lang-DrOm8k--.js +30 -0
  25. package/dist/{RecordHeader.vue_vue_type_script_setup_true_lang-B9mN7UxZ.js → RecordHeader.vue_vue_type_script_setup_true_lang-DqGc3Jyo.js} +1 -1
  26. package/dist/{ResourcePage.vue_vue_type_script_setup_true_lang-Cw8mGf_B.js → ResourcePage.vue_vue_type_script_setup_true_lang-DljhsTU4.js} +3 -3
  27. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-CJPvOVDV.js → RoleEditor.vue_vue_type_script_setup_true_lang-C0FIotFA.js} +11 -12
  28. package/dist/{RolePage-Dj_ocMnM.js → RolePage-DaNv049g.js} +10 -10
  29. package/dist/{RolesPage-PXrs4O-1.js → RolesPage-6hlzJes_.js} +6 -6
  30. package/dist/SearchInput.vue_vue_type_script_setup_true_lang-w4eAqyZ9.js +32 -0
  31. package/dist/{SectionList.vue_vue_type_script_setup_true_lang-CtdF1zuv.js → SectionList.vue_vue_type_script_setup_true_lang-DR0_NsqC.js} +1 -1
  32. package/dist/{SectionNavigator.vue_vue_type_script_setup_true_lang-B5ove3rM.js → SectionNavigator.vue_vue_type_script_setup_true_lang-Dh3sXUt_.js} +2 -2
  33. package/dist/{SegmentedField.vue_vue_type_script_setup_true_lang-ChfDFAA2.js → SegmentedField.vue_vue_type_script_setup_true_lang-zv_AxpBn.js} +1 -1
  34. package/dist/{SelectField.vue_vue_type_script_setup_true_lang-BP8nAQwo.js → SelectField.vue_vue_type_script_setup_true_lang-BZwdANL3.js} +3 -3
  35. package/dist/{ServiceAccountDialog.vue_vue_type_script_setup_true_lang-aWkKwxNe.js → ServiceAccountDialog.vue_vue_type_script_setup_true_lang-C0OIBrSp.js} +20 -20
  36. package/dist/{ServiceAccountRecord-bxX9yQkC.js → ServiceAccountRecord-gtlhYaAz.js} +37 -37
  37. package/dist/{ServiceAccountsList-BXE6htxk.js → ServiceAccountsList-BM7GGcvw.js} +33 -33
  38. package/dist/{Sessions--Gvc0kxw.js → Sessions-BCDJYuV2.js} +23 -24
  39. package/dist/{SettingsPage-DzDC7gD-.js → SettingsPage-DUhMsYBf.js} +27 -30
  40. package/dist/{SignIn-CTI_699e.js → SignIn-4D7WohI8.js} +9 -10
  41. package/dist/{SignInPage-HKC1bm2E.js → SignInPage-B6B-34GG.js} +4 -4
  42. package/dist/SignIns-CFoe4hpX.js +64 -0
  43. package/dist/StatusLine.vue_vue_type_script_setup_true_lang-DsdQmLq6.js +56 -0
  44. package/dist/{SwitchField.vue_vue_type_script_setup_true_lang-BMA2YXTZ.js → SwitchField.vue_vue_type_script_setup_true_lang-Ds4q0bbl.js} +1 -1
  45. package/dist/{TextField.vue_vue_type_script_setup_true_lang-BFVsqcBX.js → TextField.vue_vue_type_script_setup_true_lang-CWIeeZRE.js} +2 -2
  46. package/dist/{TextareaField.vue_vue_type_script_setup_true_lang-Dyh4Hhyl.js → TextareaField.vue_vue_type_script_setup_true_lang-D2j4s96s.js} +1 -1
  47. package/dist/{TimeField.vue_vue_type_script_setup_true_lang-gGFfQLuK.js → TimeField.vue_vue_type_script_setup_true_lang-D-Em4glH.js} +1 -1
  48. package/dist/UserRecord-Cd1TCpJZ.js +202 -0
  49. package/dist/UsersList-GJU5-CTG.js +74 -0
  50. package/dist/access/index.js +4 -4
  51. package/dist/app/index.js +1 -1
  52. package/dist/{application-BmXW6iW_.js → application-CuzT-0vW.js} +1 -1
  53. package/dist/button/index.js +6 -5
  54. package/dist/collection/PickerModal.vue.d.ts +26 -0
  55. package/dist/collection/definition.d.ts +6 -6
  56. package/dist/collection/http.d.ts +6 -6
  57. package/dist/collection/index.d.ts +5 -1
  58. package/dist/collection/index.js +144 -85
  59. package/dist/collection/picker.d.ts +39 -0
  60. package/dist/collection/types.d.ts +9 -4
  61. package/dist/collection/useCollection.d.ts +5 -5
  62. package/dist/content/ActivityStream.vue.d.ts +62 -0
  63. package/dist/content/CommentThread.vue.d.ts +52 -0
  64. package/dist/content/Composer.vue.d.ts +36 -0
  65. package/dist/content/index.d.ts +3 -0
  66. package/dist/content/index.js +321 -56
  67. package/dist/controls/index.js +28 -54
  68. package/dist/form/index.js +132 -134
  69. package/dist/format/index.d.ts +1 -0
  70. package/dist/format/index.js +10 -6
  71. package/dist/format/slug.d.ts +8 -0
  72. package/dist/highlight-DnYhLXnu.js +9 -0
  73. package/dist/http-Dm0uXY9O.js +95 -0
  74. package/dist/i18n/index.d.ts +14 -0
  75. package/dist/i18n/index.js +87 -63
  76. package/dist/i18n/plural.d.ts +23 -0
  77. package/dist/identity/embed.d.ts +39 -0
  78. package/dist/identity/index.d.ts +20 -0
  79. package/dist/identity/index.js +40 -21
  80. package/dist/identity/session.d.ts +9 -1
  81. package/dist/identity/shared/ChangeFeed.vue.d.ts +6 -3
  82. package/dist/identity/users/context.d.ts +8 -0
  83. package/dist/identity/users/dialogs.d.ts +10 -0
  84. package/dist/identity/users/ext.d.ts +8 -0
  85. package/dist/identity/users/feature.d.ts +10 -0
  86. package/dist/identity/users/list.d.ts +1 -1
  87. package/dist/identity/users/personSections.d.ts +1 -1
  88. package/dist/identity/users/replace.d.ts +45 -0
  89. package/dist/identity/users/words.d.ts +28 -0
  90. package/dist/incidents/api.d.ts +1 -1
  91. package/dist/incidents/index.js +1 -1
  92. package/dist/{index-Dz0LkLM8.js → index-CTkG-acm.js} +4 -4
  93. package/dist/{index-Dm-sdJJr.js → index-DUs7WSz-.js} +31 -32
  94. package/dist/index-pJ_eRg80.js +1257 -0
  95. package/dist/index.d.ts +1 -1
  96. package/dist/index.js +1 -1
  97. package/dist/modal/index.js +3 -3
  98. package/dist/modules/identity/entities.d.ts +7 -0
  99. package/dist/modules/identity/routes.d.ts +8 -4
  100. package/dist/modules/identity/schemas.d.ts +16 -0
  101. package/dist/{neighbors-DVfU9T0o.js → neighbors-OyvGi233.js} +2 -2
  102. package/dist/notifications/deadletters/list.d.ts +1 -1
  103. package/dist/notifications/index.js +1 -1
  104. package/dist/{options-QuOkMKVZ.js → options-B48UiYsG.js} +2 -2
  105. package/dist/page/index.js +11 -11
  106. package/dist/phone/index.js +1 -1
  107. package/dist/pwa/AndroidInstallBanner.vue.d.ts +18 -0
  108. package/dist/pwa/InstallQrSheet.vue.d.ts +21 -0
  109. package/dist/pwa/IosInstallGuide.vue.d.ts +19 -0
  110. package/dist/pwa/QrCode.vue.d.ts +16 -0
  111. package/dist/pwa/index.d.ts +4 -0
  112. package/dist/pwa/index.js +244 -24
  113. package/dist/resource/index.js +1 -1
  114. package/dist/{rowLayout-CT8vWYgI.js → rowLayout-Il4psyXN.js} +183 -188
  115. package/dist/shell/DarkModeRow.vue.d.ts +15 -0
  116. package/dist/shell/OfflineNotice.vue.d.ts +2 -0
  117. package/dist/shell/QuickSearchButton.vue.d.ts +2 -0
  118. package/dist/shell/QuickSearchPalette.vue.d.ts +12 -0
  119. package/dist/shell/darkMode.d.ts +26 -0
  120. package/dist/shell/index.d.ts +10 -0
  121. package/dist/shell/index.js +963 -580
  122. package/dist/shell/offlineNotice.d.ts +3 -0
  123. package/dist/shell/quickSearch.d.ts +14 -0
  124. package/dist/shell/quickSearchControl.d.ts +66 -0
  125. package/dist/shortcut-DUR6yPWA.js +93 -0
  126. package/dist/state/BackgroundTaskCapsule.vue.d.ts +18 -0
  127. package/dist/state/backgroundTasks.d.ts +58 -0
  128. package/dist/state/index.d.ts +4 -0
  129. package/dist/state/index.js +194 -80
  130. package/dist/state/useCountUp.d.ts +9 -0
  131. package/dist/styles.css +1 -1
  132. package/dist/{suggestions-BVQhoXzS.js → suggestions-q_v3M7G6.js} +1 -1
  133. package/dist/testing/collection.d.ts +1 -1
  134. package/dist/{useCommand-Dc8Lgs9h.js → useCommand-Ch_nx1AQ.js} +4 -4
  135. package/dist/{useGroupSheet-DQ6cVG-z.js → useGroupSheet-CPjHydQV.js} +14 -15
  136. package/dist/{useRecordDialog-BTsbHY38.js → useRecordDialog-DdkauXnU.js} +1 -1
  137. package/dist/{useResourceForm-DJ4Q75pq.js → useResourceForm-Dl6YFYyz.js} +1 -1
  138. package/package.json +3 -2
  139. package/dist/ActionRow.vue_vue_type_script_setup_true_lang-Cg1lhpcA.js +0 -45
  140. package/dist/Activity-29hsZ28j.js +0 -156
  141. package/dist/Button.vue_vue_type_script_setup_true_lang-Dp7OB-eF.js +0 -192
  142. package/dist/Changes-Dxjdkd_5.js +0 -129
  143. package/dist/FormErrors.vue_vue_type_script_setup_true_lang-CIggKPtq.js +0 -295
  144. package/dist/FormGroup.vue_vue_type_script_setup_true_lang-B37dixvJ.js +0 -137
  145. package/dist/PageBar.vue_vue_type_script_setup_true_lang-qI94fjJv.js +0 -47
  146. package/dist/ProfilePage-BnohZIEg.js +0 -764
  147. package/dist/ProgressTrack.vue_vue_type_script_setup_true_lang-B6Prw9hi.js +0 -64
  148. package/dist/SectionIntro.vue_vue_type_script_setup_true_lang-CZtPrmXD.js +0 -23
  149. package/dist/SessionList.vue_vue_type_script_setup_true_lang-Cnyt5V8T.js +0 -133
  150. package/dist/SignIns-BcqBgWgN.js +0 -121
  151. package/dist/UserRecord-CtUPpbCt.js +0 -267
  152. package/dist/UsersList-BMkIgIg8.js +0 -155
  153. package/dist/definition-C7QuyV3i.js +0 -54
  154. package/dist/fieldMessages-B6GHgi40.js +0 -25
  155. package/dist/http-nz92KjdS.js +0 -42
  156. package/dist/index-CdtofdcJ.js +0 -501
  157. package/dist/languages-BShG9LpE.js +0 -10
  158. package/dist/signInEvents-DWShrJox.js +0 -30
  159. package/dist/status-BRA14qwX.js +0 -34
  160. package/dist/useWaitStatus-fsacMl4W.js +0 -24
@@ -0,0 +1,1257 @@
1
+ import { r as h } from "./route-goWMxDUN.js";
2
+ import { d as se, p as oe } from "./feature-DdUAfyi4.js";
3
+ import { k as Pe } from "./keepAlive-z3IRFkQq.js";
4
+ import { d as Y } from "./defineRoutes-BGAdiIrt.js";
5
+ import { d as B } from "./context-Ch1r4fdN.js";
6
+ import { defineComponent as E, computed as P, watch as te, openBlock as m, createElementBlock as k, ref as ie, useTemplateRef as Oe, watchEffect as Ae, onBeforeUnmount as Ie, createVNode as v, unref as t, createElementVNode as g, toDisplayString as _, createCommentVNode as S, createBlock as w, useId as Le, Teleport as Re, normalizeClass as le, createTextVNode as T, withCtx as p, mergeProps as L, h as Ke, Fragment as U, renderList as W, createSlots as pe, renderSlot as Ue } from "vue";
7
+ import { a as F } from "./error-CD7x0Jrz.js";
8
+ import { u as ae } from "./environment-Dva-SG8D.js";
9
+ import { u as G } from "./describeError-B-NMa--w.js";
10
+ import { t as j } from "./toast-CqSDTWRX.js";
11
+ import { u as R, h as H, f as ne } from "./platform-BQOX_Ntw.js";
12
+ import { useI18n as C } from "vue-i18n";
13
+ import { _ as fe } from "./Icon.vue_vue_type_script_lang-BhhsFYwp.js";
14
+ import { useRouter as ge, useRoute as je, RouterLink as ze } from "vue-router";
15
+ import { _ as _e } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-BIYgaihv.js";
16
+ import { _ as z } from "./Button.vue_vue_type_script_setup_true_lang-C74hcb0N.js";
17
+ import { u as qe } from "./leaveGuard-Cc8yeLxM.js";
18
+ import { _ as Fe } from "./FormView.vue_vue_type_script_setup_true_lang-DvbPEiNQ.js";
19
+ import { _ as K } from "./TextField.vue_vue_type_script_setup_true_lang-CWIeeZRE.js";
20
+ import { u as Ne } from "./mediaQuery-CygcXmFW.js";
21
+ import { u as De } from "./useDialog-DfNmqM-0.js";
22
+ import { c as Be } from "./closeOverlays-CjVsIrpL.js";
23
+ import { u as Ge, a as V } from "./FormGroup.vue_vue_type_script_setup_true_lang-D6jYfNjW.js";
24
+ import { u as J } from "./format-D8KUBmbS.js";
25
+ import { b as Ve } from "./routeResource-DlTsGTg_.js";
26
+ import { _ as D } from "./IconTile.vue_vue_type_script_setup_true_lang-BmxCuUZ9.js";
27
+ import { g as q } from "./options-B48UiYsG.js";
28
+ import { u as he, _ as ve } from "./useCommand-Ch_nx1AQ.js";
29
+ import { u as ye } from "./ActionRow.vue_vue_type_script_setup_true_lang-IpcP3Bjc.js";
30
+ import { l as Me } from "./languageName-CItV_SOv.js";
31
+ import { _ as We } from "./SelectField.vue_vue_type_script_setup_true_lang-BZwdANL3.js";
32
+ import { d as He, r as Xe } from "./http-Dm0uXY9O.js";
33
+ import { z as i } from "zod";
34
+ import { _ as X } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
35
+ import { _ as Ye } from "./DataTable.vue_vue_type_script_setup_true_lang-BQRG8bpH.js";
36
+ import { _ as Je } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
37
+ import { _ as Qe } from "./AccessGate.vue_vue_type_script_setup_true_lang-CzQbD2Pc.js";
38
+ import "./routes-Beyr5NQo.js";
39
+ const O = {
40
+ login: h("POST", "/v1/auth/login", { public: !0 }),
41
+ refresh: h("POST", "/v1/auth/refresh", { public: !0 }),
42
+ logout: h("POST", "/v1/auth/logout"),
43
+ me: h("GET", "/v1/auth/me"),
44
+ changeLocale: h("POST", "/v1/auth/change-locale"),
45
+ loginAs: h("POST", "/v1/auth/login-as"),
46
+ loginAsReturn: h("POST", "/v1/auth/login-as/return"),
47
+ usersList: h("GET", "/v1/iam/users", { permission: "iam.user:view" }),
48
+ usersShow: h("GET", "/v1/iam/users/:id", { permission: "iam.user:view" }),
49
+ usersCreate: h("POST", "/v1/iam/users", { permission: "iam.user:manage" }),
50
+ usersUpdate: h("PUT", "/v1/iam/users/:id", { permission: "iam.user:manage" }),
51
+ usersSetPassword: h("PUT", "/v1/iam/users/:id/password", { permission: "iam.user:manage" }),
52
+ usersDeactivate: h("POST", "/v1/iam/users/:id/deactivate", { permission: "iam.user:manage" }),
53
+ usersActivate: h("POST", "/v1/iam/users/:id/activate", { permission: "iam.user:manage" }),
54
+ usersUnlock: h("POST", "/v1/iam/users/:id/unlock", { permission: "iam.user:manage" }),
55
+ usersSignins: h("GET", "/v1/iam/users/:id/signins", { permission: "iam.user:view" }),
56
+ usersChanges: h("GET", "/v1/iam/users/:id/changes", { permission: "iam.user:view" }),
57
+ usersActivity: h("GET", "/v1/iam/users/:id/activity", { permission: "iam.user.activity:view" }),
58
+ usersSessions: h("GET", "/v1/iam/users/:id/sessions", { permission: "iam.user:view" }),
59
+ usersRevokeSession: h("DELETE", "/v1/iam/users/:id/sessions/:session_id", { permission: "iam.user:manage" }),
60
+ usersRevokeSessions: h("DELETE", "/v1/iam/users/:id/sessions", { permission: "iam.user:manage" }),
61
+ profileShow: h("GET", "/v1/iam/profile"),
62
+ profileUpdate: h("PUT", "/v1/iam/profile"),
63
+ profileChangePassword: h("PUT", "/v1/iam/profile/password"),
64
+ profileRequestEmail: h("POST", "/v1/iam/profile/email"),
65
+ profileResendEmail: h("POST", "/v1/iam/profile/email/resend"),
66
+ profileConfirmEmail: h("POST", "/v1/iam/profile/email/confirm"),
67
+ profileCancelEmail: h("DELETE", "/v1/iam/profile/email"),
68
+ profileSignins: h("GET", "/v1/iam/profile/signins"),
69
+ profileSessions: h("GET", "/v1/iam/profile/sessions"),
70
+ profileRevokeSession: h("DELETE", "/v1/iam/profile/sessions/:session_id")
71
+ }, [Ze, be] = B("vue-core.identity"), Q = (e) => F(e) && e.kind === "unauthorized";
72
+ function et(e) {
73
+ if (!F(e) || e.code !== "identity.signin.locked") return null;
74
+ const n = e.params?.locked_until, s = typeof n == "string" ? new Date(n) : null;
75
+ return s && !Number.isNaN(s.getTime()) ? s : null;
76
+ }
77
+ async function tt({ http: e, session: n }, s) {
78
+ await e.request(O.login, s, { handleUnauthorized: !1 }), await re({ session: n });
79
+ }
80
+ async function re({ session: e }) {
81
+ const n = await e.refresh();
82
+ if (n.status === "failed") throw n.error;
83
+ if (n.status !== "authenticated") throw new Error("The server accepted the request but reports nobody signed in.");
84
+ }
85
+ async function nt(e, n) {
86
+ await e.http.request(O.loginAs, { user_id: n }), await re(e);
87
+ }
88
+ async function st(e) {
89
+ await e.http.request(O.loginAsReturn), await re(e);
90
+ }
91
+ const ot = { hidden: "" }, it = /* @__PURE__ */ E({
92
+ __name: "LocaleSync",
93
+ setup(e) {
94
+ const { http: n, session: s } = R(), o = ae(), c = G(), r = P(() => {
95
+ const a = s.state.value, l = a.status === "authenticated" ? a.user.locale : void 0;
96
+ return typeof l == "string" ? l : null;
97
+ });
98
+ let d = null;
99
+ return te(r, async (a) => {
100
+ d = a, a !== null && a !== o.locale.value && o.locales.includes(a) && await o.setLocale(a);
101
+ }, { immediate: !0 }), te(o.locale, async (a) => {
102
+ if (!(s.state.value.status !== "authenticated" || a === d))
103
+ try {
104
+ await n.request(O.changeLocale, { locale: a }), d = a;
105
+ } catch (l) {
106
+ if (Q(l)) return;
107
+ j.error(c(l)), F(l) && l.code === "identity.locale.unsupported" && d !== null && await o.setLocale(d);
108
+ }
109
+ }), (a, l) => (m(), k("span", ot));
110
+ }
111
+ });
112
+ function we() {
113
+ const e = R(), n = ge(), { home: s } = be(), o = G(), c = ie(!1), r = P(() => H(e.session.state.value)?.impersonator != null);
114
+ async function d() {
115
+ c.value = !0;
116
+ try {
117
+ await st(e), await n.push(s);
118
+ } catch (a) {
119
+ Q(a) || j.error(o(a)), e.session.refresh();
120
+ } finally {
121
+ c.value = !1;
122
+ }
123
+ }
124
+ return { impersonating: r, returning: c, leave: d };
125
+ }
126
+ const at = { class: "min-w-0 flex-1" }, rt = { class: "hidden md:inline" }, ct = { class: "md:hidden" }, lt = ["disabled"], ut = /* @__PURE__ */ E({
127
+ __name: "ImpersonationBanner",
128
+ setup(e) {
129
+ const { t: n } = C(), s = R(), { returning: o, leave: c } = we(), r = P(() => H(s.session.state.value)?.impersonator ?? null), d = P(() => {
130
+ const u = H(s.session.state.value)?.user;
131
+ return typeof u?.name == "string" ? u.name : typeof u?.login == "string" ? u.login : String(u?.id ?? "");
132
+ }), a = Oe("strip");
133
+ let l = null;
134
+ return Ae(() => {
135
+ l?.disconnect(), l = null;
136
+ const u = a.value;
137
+ if (!u) return void document.documentElement.style.removeProperty("--shell-banner-h");
138
+ if (typeof ResizeObserver > "u") return;
139
+ const f = () => document.documentElement.style.setProperty("--shell-banner-h", `${u.offsetHeight}px`);
140
+ l = new ResizeObserver(f), l.observe(u), f();
141
+ }, { flush: "post" }), Ie(() => {
142
+ l?.disconnect(), document.documentElement.style.removeProperty("--shell-banner-h");
143
+ }), (u, f) => r.value ? (m(), k("div", {
144
+ key: 0,
145
+ ref_key: "strip",
146
+ ref: a,
147
+ role: "status",
148
+ "data-impersonation-banner": "",
149
+ class: "sticky top-0 z-40 flex flex-wrap items-center gap-x-3 gap-y-1.5 bg-status-warning-surface px-4 py-2 text-subheadline text-status-warning-content shadow-[inset_0_-1px_0_rgb(154_74_7/0.25)]"
150
+ }, [
151
+ v(t(fe), {
152
+ name: "informationLine",
153
+ size: 18,
154
+ class: "shrink-0 compact:hidden"
155
+ }),
156
+ g("span", at, [
157
+ g("span", rt, _(t(n)("core.identity.impersonation.banner", { name: d.value })), 1),
158
+ g("span", ct, _(t(n)("core.identity.impersonation.banner_short", { name: d.value })), 1)
159
+ ]),
160
+ g("button", {
161
+ type: "button",
162
+ disabled: t(o),
163
+ class: "hit-target cursor-pointer rounded-control bg-status-warning-solid px-3 py-1 text-footnote font-semibold whitespace-nowrap text-white transition duration-motion-fast hover:brightness-110 disabled:opacity-45",
164
+ onClick: f[0] || (f[0] = //@ts-ignore
165
+ (...b) => t(c) && t(c)(...b))
166
+ }, _(t(n)("core.identity.impersonation.return")), 9, lt)
167
+ ], 512)) : S("", !0);
168
+ }
169
+ }), dt = /* @__PURE__ */ E({
170
+ __name: "ReturnMenuItem",
171
+ setup(e) {
172
+ const { t: n } = C(), { impersonating: s, leave: o } = we();
173
+ return (c, r) => t(s) ? (m(), w(_e, {
174
+ key: 0,
175
+ label: t(n)("core.identity.impersonation.return"),
176
+ icon: "logoutBoxRLine",
177
+ "data-return-menu-item": "",
178
+ onClick: t(o)
179
+ }, null, 8, ["label", "onClick"])) : S("", !0);
180
+ }
181
+ });
182
+ function mt(e = {}) {
183
+ const { t: n } = C(), s = R(), o = J(), c = G(), d = Ge({
184
+ defaults: () => ({ login: e.login ?? "", password: "" }),
185
+ validator: {
186
+ safeParse(l) {
187
+ const u = l, f = ["login", "password"].filter((b) => u[b] === "").map((b) => ({ path: [b], message: n("core.identity.signin.required") }));
188
+ return f.length === 0 ? { success: !0, data: u } : { success: !1, error: { issues: f } };
189
+ }
190
+ },
191
+ failureMessage(l, u) {
192
+ const f = et(u);
193
+ return f ? n("core.errors.identity.signin.locked", { locked_until: o.time(f) }) : F(u) ? c(u) : void 0;
194
+ }
195
+ }), a = P(() => d.errors.first("password") ?? (d.failure.value?.error ? d.failure.value.message : void 0));
196
+ return { form: d, passwordError: a, submit: async () => (await d.submit((l) => tt(s, l))).status === "saved" };
197
+ }
198
+ const pt = ["aria-labelledby"], ft = ["id"], gt = { class: "mt-1 text-subheadline text-content-muted" }, _t = { class: "flex items-center gap-2 rounded-control bg-status-success-surface px-2.5 py-2 text-footnote text-status-success-content" }, ht = { class: "flex flex-col gap-1.5" }, vt = { class: "text-footnote text-content-muted" }, yt = {
199
+ class: "rounded-control bg-fill px-2.5 py-2 text-body text-content-muted",
200
+ "data-expiry-login": ""
201
+ }, bt = /* @__PURE__ */ E({
202
+ __name: "SessionExpiry",
203
+ setup(e) {
204
+ const { t: n } = C(), { session: s } = R(), o = je(), c = qe(), r = G(), d = Ne(), a = Le(), l = P(() => {
205
+ const $ = s.state.value, A = $.status === "anonymous" && $.reason === "expired" ? $.previous?.user : void 0;
206
+ return typeof A?.login == "string" ? A.login : null;
207
+ }), u = P(() => l.value !== null && o.meta.public !== !0), f = ie(null), b = De(f, { onEscape: () => {
208
+ } }), { isOpen: x } = b, { form: y, passwordError: N, submit: M } = mt({ login: l.value ?? "" });
209
+ te(u, ($) => {
210
+ $ ? (y.hydrate({ login: l.value ?? "", password: "" }), Be(), j.dismiss(), b.present()) : b.dismissWithoutAsking();
211
+ }, { immediate: !0, flush: "post" });
212
+ async function I() {
213
+ if (!(c.hasUnsavedChanges() && !await c.confirm()))
214
+ try {
215
+ await s.signOut();
216
+ } catch ($) {
217
+ Q($) || j.error(r($));
218
+ }
219
+ }
220
+ return ($, A) => (m(), w(Re, { to: "body" }, [
221
+ t(x) ? (m(), k("div", {
222
+ key: 0,
223
+ class: "relative z-10000",
224
+ role: "alertdialog",
225
+ "aria-modal": "true",
226
+ "aria-labelledby": t(a),
227
+ "data-session-expiry": ""
228
+ }, [
229
+ A[0] || (A[0] = g("div", {
230
+ class: "fixed inset-0 bg-scrim",
231
+ "aria-hidden": "true"
232
+ }, null, -1)),
233
+ g("div", {
234
+ class: le(["fixed inset-0 flex p-4", t(d) ? "items-end p-0" : "items-center justify-center"])
235
+ }, [
236
+ g("div", {
237
+ ref_key: "panel",
238
+ ref: f,
239
+ tabindex: "-1",
240
+ class: le(["flex w-full flex-col gap-4 bg-surface-overlay p-6 shadow-float outline-none", t(d) ? "rounded-t-2xl pb-[max(2rem,var(--app-safe-bottom))]" : "max-w-sm rounded-menu"])
241
+ }, [
242
+ g("div", null, [
243
+ g("h2", {
244
+ id: t(a),
245
+ class: "text-headline font-semibold text-content-strong"
246
+ }, _(t(n)("core.identity.expired.title")), 9, ft),
247
+ g("p", gt, _(t(n)("core.identity.expired.body")), 1)
248
+ ]),
249
+ g("p", _t, [
250
+ v(t(fe), {
251
+ name: "checkboxCircleFill",
252
+ size: 16,
253
+ class: "shrink-0"
254
+ }),
255
+ T(" " + _(t(n)("core.identity.expired.kept")), 1)
256
+ ]),
257
+ v(t(Fe), { onSubmit: t(M) }, {
258
+ default: p(() => [
259
+ g("div", ht, [
260
+ g("span", vt, _(t(n)("core.identity.username")), 1),
261
+ g("span", yt, _(l.value), 1)
262
+ ]),
263
+ v(t(K), L(t(y).bind("password"), {
264
+ label: t(n)("core.identity.signin.password"),
265
+ type: "password",
266
+ autocomplete: "current-password",
267
+ required: "",
268
+ error: t(N)
269
+ }), null, 16, ["label", "error"]),
270
+ v(t(z), {
271
+ type: "submit",
272
+ prominence: "primary",
273
+ class: "w-full",
274
+ processing: t(y).submitting.value
275
+ }, {
276
+ default: p(() => [
277
+ T(_(t(n)("core.identity.signin.submit")), 1)
278
+ ]),
279
+ _: 1
280
+ }, 8, ["processing"])
281
+ ]),
282
+ _: 1
283
+ }, 8, ["onSubmit"]),
284
+ v(t(z), {
285
+ prominence: "plain",
286
+ class: "self-center",
287
+ onClick: I
288
+ }, {
289
+ default: p(() => [
290
+ T(_(t(n)("core.identity.expired.sign_out")), 1)
291
+ ]),
292
+ _: 1
293
+ })
294
+ ], 2)
295
+ ], 2)
296
+ ], 8, pt)) : S("", !0)
297
+ ]));
298
+ }
299
+ }), wt = Y({
300
+ login: { name: "login", path: "/login", component: () => import("./SignInPage-B6B-34GG.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
301
+ });
302
+ function Wn(e = {}) {
303
+ return se({
304
+ id: "identity",
305
+ routes: wt.records,
306
+ context: oe(Ze, { home: e.home ?? "/" }),
307
+ holdsExpiredSession: !0,
308
+ contributions: [
309
+ // Not optional: a shell without a `host` could not ask for the password, and the person would be stuck on a dead page.
310
+ { id: "identity.expiry", slot: "host", component: bt, scope: "always" },
311
+ // Not optional either: acting as somebody else must always be visible.
312
+ { id: "identity.impersonation", slot: "banner", component: ut, scope: "authenticated" },
313
+ // The same way out in the account menu (a shell without that slot shows only the banner's button).
314
+ { id: "identity.return", slot: "accountMenu", component: dt, scope: "authenticated", optional: !0, order: -20 },
315
+ { id: "identity.locale", slot: "host", component: it, scope: "authenticated", optional: !0 }
316
+ ],
317
+ effects: [Pe()]
318
+ });
319
+ }
320
+ const xt = (e) => F(e) && e.kind === "unauthorized";
321
+ function Hn(e = {}) {
322
+ const n = e.tokenKey ?? "embed_access_token", s = e.expiresKey ?? "embed_expires_at", o = () => {
323
+ try {
324
+ return e.storage ?? sessionStorage;
325
+ } catch {
326
+ return null;
327
+ }
328
+ }, c = (d) => {
329
+ try {
330
+ return o()?.getItem(d) ?? null;
331
+ } catch {
332
+ return null;
333
+ }
334
+ };
335
+ return {
336
+ start(d, a) {
337
+ try {
338
+ o()?.setItem(n, d), o()?.setItem(s, a);
339
+ } catch {
340
+ }
341
+ },
342
+ end() {
343
+ try {
344
+ o()?.removeItem(n), o()?.removeItem(s);
345
+ } catch {
346
+ }
347
+ },
348
+ token: () => c(n),
349
+ active: () => c(n) !== null,
350
+ expired() {
351
+ const d = c(s);
352
+ return d === null || new Date(d) <= /* @__PURE__ */ new Date();
353
+ }
354
+ };
355
+ }
356
+ const kt = (e) => () => {
357
+ const n = e.token();
358
+ return n ? { Authorization: `Bearer ${n}` } : {};
359
+ };
360
+ function St(e, n, s, o) {
361
+ return {
362
+ async load(c) {
363
+ if (!o.active()) return e.load(c);
364
+ if (o.expired())
365
+ return o.end(), null;
366
+ try {
367
+ const { data: r } = await n.request(O.me, void 0, { signal: c, handleUnauthorized: !1 });
368
+ return ne(r, s);
369
+ } catch (r) {
370
+ if (!xt(r)) throw r;
371
+ return o.end(), null;
372
+ }
373
+ },
374
+ async signOut() {
375
+ try {
376
+ await e.signOut();
377
+ } finally {
378
+ o.end();
379
+ }
380
+ }
381
+ };
382
+ }
383
+ const Et = (e) => typeof e == "object" && e !== null && !Array.isArray(e), $t = (e) => {
384
+ if (!Et(e)) throw new TypeError("expected an object");
385
+ if (typeof e.id != "number") throw new TypeError("id: expected a number");
386
+ for (const n of ["login", "name", "email", "locale"])
387
+ if (typeof e[n] != "string") throw new TypeError(`${n}: expected a string`);
388
+ return { id: e.id, login: e.login, name: e.name, email: e.email, locale: e.locale };
389
+ }, ee = (e) => F(e) && e.kind === "unauthorized", xe = (e, n) => e.request(O.refresh, { refresh_token: "" }, { signal: n, handleUnauthorized: !1 });
390
+ function Tt(e, n) {
391
+ return {
392
+ async load(s) {
393
+ try {
394
+ const { data: o } = await e.request(O.me, void 0, { signal: s, handleUnauthorized: !1 });
395
+ return ne(o, n);
396
+ } catch (o) {
397
+ if (!ee(o)) throw o;
398
+ }
399
+ try {
400
+ const { data: o } = await xe(e, s);
401
+ return ne(o, n);
402
+ } catch (o) {
403
+ if (ee(o)) return null;
404
+ throw o;
405
+ }
406
+ },
407
+ async signOut() {
408
+ try {
409
+ await e.request(O.logout, void 0, { handleUnauthorized: !1 });
410
+ } catch (s) {
411
+ if (!ee(s)) throw s;
412
+ }
413
+ }
414
+ };
415
+ }
416
+ function Xn(e) {
417
+ const n = e?.parseUser ?? $t, s = e?.embed;
418
+ return {
419
+ session: (c) => {
420
+ const r = Tt(c, n);
421
+ return s ? St(r, c, n, s) : r;
422
+ },
423
+ ...(s || e?.renewable) && { renewable: () => !s?.active() && (e?.renewable?.() ?? !0) },
424
+ ...s && { headers: kt(s), onSessionExpired: s.end },
425
+ async renewSession(c, r) {
426
+ try {
427
+ return await xe(r), (await c.refresh()).status === "authenticated";
428
+ } catch {
429
+ return !1;
430
+ }
431
+ }
432
+ };
433
+ }
434
+ const ke = Y({
435
+ index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-BQCK2w8R.js"), meta: { titleKey: "core.profile.title" } }
436
+ }), Ct = /* @__PURE__ */ E({
437
+ __name: "ProfileMenuItem",
438
+ setup(e) {
439
+ const { t: n } = C();
440
+ return (s, o) => (m(), w(_e, {
441
+ label: t(n)("core.profile.menu"),
442
+ icon: "user3Line",
443
+ to: t(ke).index,
444
+ "data-profile-menu-item": ""
445
+ }, null, 8, ["label", "to"]));
446
+ }
447
+ }), [Pt, Ot] = B("vue-core.users"), At = Symbol("vue-core.users.person"), [Yn, Jn] = B("vue-core.users.personActions"), [Qn, Zn] = B("vue-core.users.personSessions");
448
+ function It(e) {
449
+ const n = E({
450
+ name: `PersonSection(${e.path})`,
451
+ setup() {
452
+ const s = Ve(At);
453
+ return () => s.data.value ? Ke(e.component, e.props?.(s.data.value) ?? {}) : null;
454
+ }
455
+ });
456
+ return { name: `users.record.${e.path}`, path: e.path, component: n, meta: { ...e.meta } };
457
+ }
458
+ const ue = "iam.user:view", es = "iam.user:manage", Lt = "iam.user.activity:view", Se = Y({
459
+ index: { name: "users.index", path: "/users", component: () => import("./UsersList-GJU5-CTG.js"), meta: { access: ue, titleKey: "core.users.title" } },
460
+ record: {
461
+ name: "users.record",
462
+ path: "/users/:id",
463
+ component: () => import("./UserRecord-Cd1TCpJZ.js"),
464
+ meta: { access: ue, titleKey: "core.users.title", remountOnParam: "id" },
465
+ children: [
466
+ { name: "users.record.general", path: "general", component: () => import("./General-BDmCJr3H.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
467
+ { name: "users.record.signin", path: "signin", component: () => import("./SignIn-4D7WohI8.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
468
+ { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-BCDJYuV2.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
469
+ { name: "users.record.signins", path: "signins", component: () => import("./SignIns-CFoe4hpX.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
470
+ { name: "users.record.changes", path: "changes", component: () => import("./Changes-B9-zpDxG.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
471
+ { name: "users.record.activity", path: "activity", component: () => import("./Activity-CeAG0ZtJ.js"), meta: { access: Lt, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
472
+ ]
473
+ }
474
+ });
475
+ function Rt(e, n, s) {
476
+ return Se.records.map((o) => {
477
+ if (o.name === "users.index") return { ...o, path: e, ...n.list && { component: n.list } };
478
+ if (o.name !== "users.record") return o;
479
+ const c = (o.children ?? []).map((r) => r.name === "users.record.general" && n.general ? { ...r, component: n.general } : r);
480
+ return { ...o, path: `${e}/:id`, children: [...c, ...s.map(It)] };
481
+ });
482
+ }
483
+ function ts(e = {}) {
484
+ const n = e.people ?? !0, s = e.profile ?? !0, o = e.signInAs ?? "iam.user:impersonate", c = e.replace ?? {}, r = (e.path ?? "/users").replace(/\/+$/, "") || "/users";
485
+ return se({
486
+ id: "users",
487
+ routes: [...n ? Rt(r, c, e.sections ?? []) : [], ...s ? ke.records : []],
488
+ context: oe(Pt, {
489
+ signInAs: o,
490
+ activityAreas: e.activityAreas ?? {},
491
+ profileSections: e.profileSections ?? [],
492
+ replace: c,
493
+ activityRecords: e.activityRecords ?? {},
494
+ changeWords: e.changeWords
495
+ }),
496
+ navigation: n && e.destination ? [{ destination: e.destination, to: Se.index, within: ["users.record"] }] : [],
497
+ // The entry of the account menu; a shell without that menu leaves it out.
498
+ contributions: s ? [{ id: "users.profile", slot: "accountMenu", component: Ct, scope: "authenticated", optional: !0, order: -10 }] : [],
499
+ requires: n && o !== !1 ? ["identity"] : []
500
+ });
501
+ }
502
+ const Kt = /* @__PURE__ */ E({
503
+ __name: "DeactivateDialog",
504
+ props: {
505
+ id: {},
506
+ name: {},
507
+ sessionCount: {}
508
+ },
509
+ emits: ["done"],
510
+ setup(e, { expose: n, emit: s }) {
511
+ const o = e, c = s, { t: r } = C(), { http: d } = R(), a = he({
512
+ ...ye(),
513
+ defaults: () => ({}),
514
+ run: () => d.request(O.usersDeactivate, { id: o.id }),
515
+ done: () => {
516
+ j.success(r("core.users.deactivate.done", { name: o.name })), c("done");
517
+ }
518
+ });
519
+ return n({ open: () => a.present() }), (l, u) => (m(), w(t(ve), {
520
+ command: t(a),
521
+ title: t(r)("core.users.deactivate.title"),
522
+ subtitle: o.name,
523
+ "confirm-label": t(r)("core.users.actions.deactivate_short"),
524
+ "busy-label": t(r)("core.users.deactivate.busy"),
525
+ "done-label": t(r)("core.users.deactivate.done_label"),
526
+ size: "md"
527
+ }, {
528
+ default: p(() => [
529
+ v(t(V), { "data-deactivate-dialog": "" }, {
530
+ default: p(() => [
531
+ v(t(q), {
532
+ layout: "setting",
533
+ label: t(r)("core.users.deactivate.signs_out", { n: o.sessionCount ?? 0 }),
534
+ sub: t(r)("core.users.deactivate.signs_out_sub")
535
+ }, {
536
+ leading: p(() => [
537
+ v(t(D), {
538
+ tone: "anchor",
539
+ icon: "logoutBoxRLine"
540
+ })
541
+ ]),
542
+ _: 1
543
+ }, 8, ["label", "sub"]),
544
+ v(t(q), {
545
+ layout: "setting",
546
+ label: t(r)("core.users.deactivate.cannot_sign_in"),
547
+ sub: t(r)("core.users.deactivate.cannot_sign_in_sub")
548
+ }, {
549
+ leading: p(() => [
550
+ v(t(D), {
551
+ tone: "anchor",
552
+ icon: "lockLine"
553
+ })
554
+ ]),
555
+ _: 1
556
+ }, 8, ["label", "sub"])
557
+ ]),
558
+ _: 1
559
+ })
560
+ ]),
561
+ _: 1
562
+ }, 8, ["command", "title", "subtitle", "confirm-label", "busy-label", "done-label"]));
563
+ }
564
+ });
565
+ function Ut() {
566
+ const e = ae();
567
+ return P(() => e.locales.map((n) => ({ value: n, label: Me(n) })));
568
+ }
569
+ const jt = /* @__PURE__ */ E({
570
+ __name: "NewUserDialog",
571
+ emits: ["created"],
572
+ setup(e, { expose: n, emit: s }) {
573
+ const { t: o } = C(), { http: c } = R(), r = ae(), d = ye(), a = Ut(), l = () => ({ login: "", name: "", email: "", phone: "", locale: r.locale.value, password: "", repeat: "" }), u = (y) => y.trim() === "", f = {
574
+ safeParse(y) {
575
+ const { repeat: N, locale: M, ...I } = y, $ = o("core.account.validation.required"), A = ["login", "name", "email", "password"].filter((Z) => u(I[Z])).map((Z) => ({ path: [Z], message: $ }));
576
+ return M === null && A.push({ path: ["locale"], message: $ }), !u(I.password) && N !== I.password && A.push({ path: ["repeat"], message: u(N) ? $ : o("core.account.validation.mismatch") }), A.length > 0 ? { success: !1, error: { issues: A } } : { success: !0, data: { ...I, locale: M ?? "", phone: u(I.phone) ? void 0 : I.phone } };
577
+ }
578
+ }, b = s, x = he({
579
+ ...d,
580
+ defaults: l,
581
+ validator: f,
582
+ run: async (y) => (await c.request(O.usersCreate, y)).data,
583
+ done: (y) => {
584
+ j.success(o("core.users.create.done", { name: y.name })), b("created", y);
585
+ }
586
+ });
587
+ return n({ create: () => x.present() }), (y, N) => (m(), w(t(ve), {
588
+ command: t(x),
589
+ title: t(o)("core.users.create.title"),
590
+ subtitle: t(o)("core.users.create.subtitle"),
591
+ "confirm-label": t(o)("core.users.create.action"),
592
+ size: "md"
593
+ }, {
594
+ default: p(() => [
595
+ v(t(V), { "label-width": "11rem" }, {
596
+ default: p(() => [
597
+ v(t(K), L(t(x).form.bind("name"), {
598
+ label: t(o)("core.users.fields.name"),
599
+ required: "",
600
+ autocomplete: "off"
601
+ }), null, 16, ["label"]),
602
+ v(t(K), L(t(x).form.bind("login"), {
603
+ label: t(o)("core.users.fields.login"),
604
+ required: "",
605
+ mono: "",
606
+ autocomplete: "off"
607
+ }), null, 16, ["label"]),
608
+ v(t(K), L(t(x).form.bind("password"), {
609
+ label: t(o)("core.users.fields.password"),
610
+ type: "password",
611
+ required: "",
612
+ autocomplete: "new-password"
613
+ }), null, 16, ["label"]),
614
+ v(t(K), L(t(x).form.bind("repeat"), {
615
+ label: t(o)("core.users.fields.password_repeat"),
616
+ type: "password",
617
+ required: "",
618
+ autocomplete: "new-password"
619
+ }), null, 16, ["label"]),
620
+ v(t(K), L(t(x).form.bind("email"), {
621
+ label: t(o)("core.users.fields.email"),
622
+ type: "email",
623
+ required: "",
624
+ autocomplete: "off"
625
+ }), null, 16, ["label"]),
626
+ v(t(K), L(t(x).form.bind("phone"), {
627
+ label: t(o)("core.users.fields.phone"),
628
+ type: "tel",
629
+ autocomplete: "off"
630
+ }), null, 16, ["label"]),
631
+ v(t(We), L(t(x).form.bind("locale"), {
632
+ label: t(o)("core.users.fields.locale"),
633
+ options: t(a),
634
+ required: ""
635
+ }), null, 16, ["label", "options"])
636
+ ]),
637
+ _: 1
638
+ })
639
+ ]),
640
+ _: 1
641
+ }, 8, ["command", "title", "subtitle", "confirm-label"]));
642
+ }
643
+ });
644
+ function ns() {
645
+ const { replace: e } = Ot();
646
+ return { newUser: e.newUser ?? jt, deactivate: e.deactivate ?? Kt };
647
+ }
648
+ i.object({
649
+ id: i.number().int(),
650
+ area: i.string().max(32).optional(),
651
+ from: i.string().max(10).optional(),
652
+ to: i.string().max(10).optional(),
653
+ page: i.number().int().optional(),
654
+ per_page: i.number().int().optional()
655
+ });
656
+ i.object({
657
+ locale: i.string().min(1).max(16)
658
+ });
659
+ i.object({
660
+ current_password: i.string().min(1).max(200),
661
+ new_password: i.string().min(1).max(200),
662
+ new_password_confirmation: i.string().min(1).max(200)
663
+ });
664
+ const zt = i.enum(["all", "access", "details"]);
665
+ i.object({
666
+ id: i.number().int(),
667
+ view: zt.optional(),
668
+ page: i.number().int().optional(),
669
+ per_page: i.number().int().optional()
670
+ });
671
+ i.object({
672
+ code: i.string().min(1).max(12)
673
+ });
674
+ i.object({
675
+ login: i.string().min(1).max(100),
676
+ name: i.string().min(1).max(150),
677
+ email: i.string().min(1).max(255),
678
+ phone: i.string().max(30).optional(),
679
+ locale: i.string().min(1).max(16),
680
+ password: i.string().min(1).max(200),
681
+ ext: i.unknown().optional()
682
+ });
683
+ i.object({
684
+ id: i.number().int(),
685
+ details: i.unknown().optional()
686
+ });
687
+ const Ee = i.enum(["never", "idle"]), qt = i.enum(["active", "locked", "inactive", "all"]);
688
+ i.object({
689
+ view: qt.optional(),
690
+ search: i.string().max(100).optional(),
691
+ order_col: i.string().max(16).optional(),
692
+ order_dir: i.string().max(4).optional(),
693
+ page: i.number().int().optional(),
694
+ per_page: i.number().int().optional(),
695
+ last_sign_in: Ee.optional()
696
+ });
697
+ i.object({
698
+ user_id: i.number().int().refine((e) => e !== 0, { params: { code: "required" } })
699
+ });
700
+ i.object({
701
+ login: i.string().min(1).max(100),
702
+ password: i.string().min(1).max(200)
703
+ });
704
+ i.object({
705
+ session_id: i.number().int()
706
+ });
707
+ const $e = i.enum(["all", "failed"]);
708
+ i.object({
709
+ view: $e.optional(),
710
+ page: i.number().int().optional(),
711
+ per_page: i.number().int().optional()
712
+ });
713
+ i.object({
714
+ refresh_token: i.string().max(255)
715
+ });
716
+ i.object({
717
+ email: i.string().min(1).max(255),
718
+ current_password: i.string().min(1).max(200)
719
+ });
720
+ i.object({
721
+ id: i.number().int(),
722
+ password: i.string().min(1).max(200)
723
+ });
724
+ i.object({
725
+ id: i.number().int(),
726
+ view: $e.optional(),
727
+ page: i.number().int().optional(),
728
+ per_page: i.number().int().optional()
729
+ });
730
+ i.object({
731
+ name: i.string().min(1).max(150),
732
+ phone: i.string().max(30).optional()
733
+ });
734
+ i.object({
735
+ id: i.number().int(),
736
+ login: i.string().min(1).max(100),
737
+ name: i.string().min(1).max(150),
738
+ email: i.string().min(1).max(255),
739
+ phone: i.string().max(30).optional(),
740
+ locale: i.string().min(1).max(16),
741
+ ext: i.unknown().optional()
742
+ });
743
+ i.object({
744
+ id: i.number().int()
745
+ });
746
+ i.object({
747
+ id: i.number().int(),
748
+ session_id: i.number().int()
749
+ });
750
+ const Ft = ["active", "locked", "inactive", "all"];
751
+ function ss(e) {
752
+ return He({
753
+ id: "identity.users",
754
+ stateVersion: 1,
755
+ load: async (n, { signal: s }) => {
756
+ const o = await e.request(
757
+ O.usersList,
758
+ {
759
+ view: n.view ?? void 0,
760
+ search: n.search || void 0,
761
+ order_col: n.sort ?? void 0,
762
+ order_dir: n.sort ? n.direction : void 0,
763
+ page: n.page,
764
+ per_page: n.pageSize,
765
+ last_sign_in: Ee.safeParse(n.filters.last_sign_in).data
766
+ },
767
+ { signal: s }
768
+ );
769
+ return Xe(o, n);
770
+ },
771
+ key: (n) => n.id,
772
+ query: { sorts: ["login", "name", "email", "created_at"], filters: ["last_sign_in"], views: Ft },
773
+ defaults: { sort: "name", direction: "asc", view: "active" }
774
+ });
775
+ }
776
+ const os = (e) => e === "locked" ? "critical" : e === "inactive" ? "neutral" : "positive", Nt = {
777
+ key: 0,
778
+ class: "flex items-center justify-between gap-3 px-row-inset text-footnote text-content-muted",
779
+ "data-page-bar": ""
780
+ }, Dt = { class: "flex gap-2" }, is = /* @__PURE__ */ E({
781
+ __name: "PageBar",
782
+ props: {
783
+ page: {},
784
+ lastPage: {},
785
+ total: {}
786
+ },
787
+ emits: ["update:page"],
788
+ setup(e, { emit: n }) {
789
+ const s = e, o = n, { t: c } = C();
790
+ return (r, d) => s.lastPage > 1 ? (m(), k("div", Nt, [
791
+ g("span", null, _(t(c)("core.collection.page.page_of", { current: s.page, total: s.lastPage })) + " · " + _(s.total), 1),
792
+ g("span", Dt, [
793
+ v(t(z), {
794
+ size: "sm",
795
+ disabled: s.page <= 1,
796
+ onClick: d[0] || (d[0] = (a) => o("update:page", s.page - 1))
797
+ }, {
798
+ default: p(() => [
799
+ T(_(t(c)("core.collection.page.previous")), 1)
800
+ ]),
801
+ _: 1
802
+ }, 8, ["disabled"]),
803
+ v(t(z), {
804
+ size: "sm",
805
+ disabled: s.page >= s.lastPage,
806
+ onClick: d[1] || (d[1] = (a) => o("update:page", s.page + 1))
807
+ }, {
808
+ default: p(() => [
809
+ T(_(t(c)("core.collection.page.next")), 1)
810
+ ]),
811
+ _: 1
812
+ }, 8, ["disabled"])
813
+ ])
814
+ ])) : S("", !0);
815
+ }
816
+ }), Bt = {
817
+ class: "flex flex-col gap-y-0.5 md:flex-row md:flex-wrap md:items-center md:gap-x-1.5",
818
+ "data-session-facts": ""
819
+ }, Gt = {
820
+ key: 0,
821
+ class: "font-mono"
822
+ }, Vt = {
823
+ key: 1,
824
+ "aria-hidden": "true",
825
+ class: "hidden md:inline"
826
+ }, Mt = {
827
+ key: 0,
828
+ class: "mt-1 flex flex-wrap gap-1"
829
+ }, as = /* @__PURE__ */ E({
830
+ __name: "SessionList",
831
+ props: {
832
+ sessions: {},
833
+ canEnd: { type: Boolean },
834
+ header: {},
835
+ footer: {}
836
+ },
837
+ emits: ["end"],
838
+ setup(e, { emit: n }) {
839
+ const s = e, o = n, { t: c } = C(), r = J();
840
+ return (d, a) => (m(), w(t(V), {
841
+ header: s.header,
842
+ footer: s.footer
843
+ }, {
844
+ default: p(() => [
845
+ s.sessions.length === 0 ? (m(), w(t(q), {
846
+ key: 0,
847
+ layout: "setting",
848
+ label: t(c)("core.account.sessions.empty")
849
+ }, null, 8, ["label"])) : S("", !0),
850
+ (m(!0), k(U, null, W(s.sessions, (l) => (m(), w(t(q), {
851
+ key: l.id,
852
+ layout: "setting",
853
+ label: l.device || t(c)("core.account.sessions.unknown_device"),
854
+ "data-session": l.id
855
+ }, pe({
856
+ leading: p(() => [
857
+ v(t(D), {
858
+ tone: "anchor",
859
+ icon: "deviceLine"
860
+ })
861
+ ]),
862
+ sub: p(() => [
863
+ g("span", Bt, [
864
+ l.ip ? (m(), k("span", Gt, _(l.ip), 1)) : S("", !0),
865
+ l.ip ? (m(), k("span", Vt, "·")) : S("", !0),
866
+ g("span", null, _(t(c)("core.account.sessions.last_active", { when: t(r).dateTime(l.last_used_at) })), 1),
867
+ a[0] || (a[0] = g("span", {
868
+ "aria-hidden": "true",
869
+ class: "hidden md:inline"
870
+ }, "·", -1)),
871
+ g("span", null, _(t(c)("core.account.sessions.expires", { when: t(r).dateTime(l.expires_at) })), 1)
872
+ ]),
873
+ l.current || l.opened_by ? (m(), k("span", Mt, [
874
+ l.current ? (m(), w(t(X), {
875
+ key: 0,
876
+ tone: "positive",
877
+ dot: "",
878
+ "data-session-current": ""
879
+ }, {
880
+ default: p(() => [
881
+ T(_(t(c)("core.account.sessions.this_device")), 1)
882
+ ]),
883
+ _: 1
884
+ })) : S("", !0),
885
+ l.opened_by ? (m(), w(t(X), {
886
+ key: 1,
887
+ tone: "warning",
888
+ "data-session-opened-by": ""
889
+ }, {
890
+ default: p(() => [
891
+ T(_(l.opened_by.name ? t(c)("core.account.sessions.opened_by", { name: l.opened_by.name }) : t(c)("core.account.sessions.opened_by_other")), 1)
892
+ ]),
893
+ _: 2
894
+ }, 1024)) : S("", !0)
895
+ ])) : S("", !0),
896
+ s.canEnd && !l.current ? (m(), w(t(z), {
897
+ key: 1,
898
+ prominence: "plain",
899
+ tone: "critical",
900
+ size: "sm",
901
+ class: "mt-1 -ml-2 md:hidden",
902
+ "data-end-session-inline": l.id,
903
+ onClick: (u) => o("end", l)
904
+ }, {
905
+ default: p(() => [
906
+ T(_(t(c)("core.account.sessions.end")), 1)
907
+ ]),
908
+ _: 1
909
+ }, 8, ["data-end-session-inline", "onClick"])) : S("", !0)
910
+ ]),
911
+ _: 2
912
+ }, [
913
+ s.canEnd && !l.current ? {
914
+ name: "trailing",
915
+ fn: p(() => [
916
+ v(t(z), {
917
+ prominence: "plain",
918
+ tone: "critical",
919
+ size: "sm",
920
+ class: "hidden md:inline-flex",
921
+ "data-end-session": l.id,
922
+ onClick: (u) => o("end", l)
923
+ }, {
924
+ default: p(() => [
925
+ T(_(t(c)("core.account.sessions.end")), 1)
926
+ ]),
927
+ _: 1
928
+ }, 8, ["data-end-session", "onClick"])
929
+ ]),
930
+ key: "0"
931
+ } : void 0
932
+ ]), 1032, ["label", "data-session"]))), 128))
933
+ ]),
934
+ _: 1
935
+ }, 8, ["header", "footer"]));
936
+ }
937
+ }), Wt = 80, Ht = (e) => /Edg\/|EdgA\/|EdgiOS\//.test(e) ? "Edge" : /Firefox\/|FxiOS\//.test(e) ? "Firefox" : /Chrome\/|CriOS\//.test(e) ? "Chrome" : /Safari\/|iPhone|iPad/.test(e) ? "Safari" : "", Xt = (e) => e.includes("iPhone") ? "iPhone" : e.includes("iPad") ? "iPad" : e.includes("Android") ? "Android" : e.includes("Windows") ? "Windows" : /Mac OS X|Macintosh/.test(e) ? "macOS" : /Linux|X11/.test(e) ? "Linux" : "";
938
+ function Te(e) {
939
+ const n = e.trim();
940
+ if (n === "") return "";
941
+ const s = Ht(n), o = Xt(n);
942
+ return s && o ? `${s} · ${o}` : [...n].slice(0, Wt).join("");
943
+ }
944
+ const Yt = {
945
+ signed_in: { tone: "positive", byOther: !1 },
946
+ wrong_password: { tone: "critical", byOther: !1 },
947
+ locked_out: { tone: "critical", byOther: !1 },
948
+ refused_inactive: { tone: "critical", byOther: !1 },
949
+ signed_in_as: { tone: "warning", byOther: !0 },
950
+ unlocked: { tone: "neutral", byOther: !0 },
951
+ signed_out_everywhere: { tone: "neutral", byOther: !0 },
952
+ session_revoked: { tone: "neutral", byOther: !0 }
953
+ };
954
+ function ce(e) {
955
+ const n = Yt[e];
956
+ return n ? { ...n, known: !0 } : { tone: "neutral", byOther: !1, known: !1 };
957
+ }
958
+ function Ce(e, n) {
959
+ const s = ce(e);
960
+ return s.known ? s.byOther && n ? `core.account.signins.events_by.${e}` : `core.account.signins.events.${e}` : "core.account.signins.events.unknown";
961
+ }
962
+ const Jt = ["title"], Qt = { class: "font-mono" }, rs = /* @__PURE__ */ E({
963
+ __name: "SignInList",
964
+ props: {
965
+ rows: {},
966
+ header: {},
967
+ footer: {}
968
+ },
969
+ setup(e) {
970
+ const n = e, { t: s } = C(), o = J(), c = (r) => s(Ce(r.event, r.actor?.name || null), { name: r.actor?.name ?? "" });
971
+ return (r, d) => (m(), w(t(V), {
972
+ header: n.header,
973
+ footer: n.footer,
974
+ "data-signin-list": ""
975
+ }, pe({
976
+ default: p(() => [
977
+ n.rows.length === 0 ? (m(), w(t(q), {
978
+ key: 0,
979
+ layout: "setting",
980
+ label: t(s)("core.account.signins.empty"),
981
+ "data-signin-empty": ""
982
+ }, null, 8, ["label"])) : S("", !0),
983
+ (m(!0), k(U, null, W(n.rows, (a) => (m(), w(t(q), {
984
+ key: a.id,
985
+ layout: "setting",
986
+ label: t(Te)(a.device) || t(s)("core.account.sessions.unknown_device"),
987
+ "data-signin-row": ""
988
+ }, {
989
+ leading: p(() => [
990
+ v(t(D), {
991
+ tone: "neutral",
992
+ icon: "timeLine"
993
+ })
994
+ ]),
995
+ sub: p(() => [
996
+ g("span", {
997
+ class: "flex flex-col gap-y-0.5 md:flex-row md:flex-wrap md:items-center md:gap-x-1.5",
998
+ title: a.device,
999
+ "data-signin-facts": ""
1000
+ }, [
1001
+ g("span", null, _(t(o).dateTime(a.created_at)), 1),
1002
+ a.ip ? (m(), k(U, { key: 0 }, [
1003
+ d[0] || (d[0] = g("span", {
1004
+ "aria-hidden": "true",
1005
+ class: "hidden md:inline"
1006
+ }, "·", -1)),
1007
+ g("span", Qt, _(a.ip), 1)
1008
+ ], 64)) : S("", !0)
1009
+ ], 8, Jt)
1010
+ ]),
1011
+ default: p(() => [
1012
+ v(t(X), {
1013
+ tone: t(ce)(a.event).tone,
1014
+ "data-event": a.event
1015
+ }, {
1016
+ default: p(() => [
1017
+ T(_(c(a)), 1)
1018
+ ]),
1019
+ _: 2
1020
+ }, 1032, ["tone", "data-event"])
1021
+ ]),
1022
+ _: 2
1023
+ }, 1032, ["label"]))), 128))
1024
+ ]),
1025
+ _: 2
1026
+ }, [
1027
+ r.$slots["header-trailing"] ? {
1028
+ name: "header-trailing",
1029
+ fn: p(() => [
1030
+ Ue(r.$slots, "header-trailing")
1031
+ ]),
1032
+ key: "0"
1033
+ } : void 0
1034
+ ]), 1032, ["header", "footer"]));
1035
+ }
1036
+ }), Zt = {
1037
+ class: "overflow-hidden rounded-group bg-surface-cell shadow-group",
1038
+ "data-signin-table": ""
1039
+ }, en = ["title"], tn = { class: "font-mono text-footnote" }, nn = {
1040
+ class: "px-4 py-8 text-center text-body text-content-muted",
1041
+ "data-signin-empty": ""
1042
+ }, cs = /* @__PURE__ */ E({
1043
+ __name: "SignInTable",
1044
+ props: {
1045
+ rows: {},
1046
+ loading: { type: Boolean }
1047
+ },
1048
+ setup(e) {
1049
+ const n = e, { t: s } = C(), o = P(() => [
1050
+ { key: "created_at", label: s("core.account.signins.columns.time"), kind: "timestamp", width: 170, mobile: "meta" },
1051
+ { key: "event", label: s("core.account.signins.columns.event"), mobile: "primary" },
1052
+ { key: "device", label: s("core.account.signins.columns.device"), hideBelow: "md", width: 320, mobile: "hidden" },
1053
+ { key: "ip", label: s("core.account.signins.columns.ip"), hideBelow: "md", width: 140, mobile: "hidden" }
1054
+ ]), c = (r) => s(Ce(r.event, r.actor?.name || null), { name: r.actor?.name ?? "" });
1055
+ return (r, d) => (m(), k("div", Zt, [
1056
+ v(t(Ye), {
1057
+ rows: n.rows,
1058
+ columns: o.value,
1059
+ "row-key": (a) => a.id,
1060
+ loading: n.loading
1061
+ }, {
1062
+ "cell-event": p(({ item: a }) => [
1063
+ v(t(X), {
1064
+ tone: t(ce)(a.event).tone,
1065
+ "data-event": a.event
1066
+ }, {
1067
+ default: p(() => [
1068
+ T(_(c(a)), 1)
1069
+ ]),
1070
+ _: 2
1071
+ }, 1032, ["tone", "data-event"])
1072
+ ]),
1073
+ "cell-device": p(({ item: a }) => [
1074
+ g("span", {
1075
+ class: "block truncate",
1076
+ title: a.device
1077
+ }, _(t(Te)(a.device) || "—"), 9, en)
1078
+ ]),
1079
+ "cell-ip": p(({ item: a }) => [
1080
+ g("span", tn, _(a.ip || "—"), 1)
1081
+ ]),
1082
+ empty: p(() => [
1083
+ g("p", nn, _(t(s)("core.account.signins.empty")), 1)
1084
+ ]),
1085
+ _: 1
1086
+ }, 8, ["rows", "columns", "row-key", "loading"])
1087
+ ]));
1088
+ }
1089
+ }), sn = { class: "flex items-center pl-0.5" }, on = { class: "flex flex-wrap items-center gap-x-1.5" }, an = {
1090
+ class: "font-medium text-content",
1091
+ "data-change-actor": ""
1092
+ }, rn = { key: 1 }, ls = /* @__PURE__ */ E({
1093
+ __name: "ChangeFeed",
1094
+ props: {
1095
+ rows: {},
1096
+ words: { type: Function }
1097
+ },
1098
+ setup(e) {
1099
+ const n = e, { t: s, te: o } = C(), c = (u, f) => s(u, f ?? {}), r = J(), d = /* @__PURE__ */ new Set(["created", "activated", "deactivated", "password"]), a = (u) => s(`core.users.changes.fields.${u}`), l = P(
1100
+ () => n.rows.map((u) => {
1101
+ const f = n.words?.(u, c), b = f?.sentence ?? (o(`core.users.changes.actions.${u.action}`) ? s(`core.users.changes.actions.${u.action}`) : s("core.users.changes.actions.unknown")), x = d.has(u.action) ? [] : u.fields.filter((y) => y !== "password" && o(`core.users.changes.fields.${y}`)).map((y) => y in u.before || y in u.after ? s("core.users.changes.diff", { field: a(y), before: u.before[y] || "—", after: u.after[y] || "—" }) : a(y));
1102
+ return { row: u, sentence: b, details: [...x, ...f?.details ?? []] };
1103
+ })
1104
+ );
1105
+ return (u, f) => (m(), w(t(V), { "data-change-feed": "" }, {
1106
+ default: p(() => [
1107
+ (m(!0), k(U, null, W(l.value, (b) => (m(), w(t(q), {
1108
+ key: b.row.id,
1109
+ layout: "setting",
1110
+ label: b.sentence,
1111
+ "data-change-row": ""
1112
+ }, {
1113
+ leading: p(() => [
1114
+ g("span", sn, [
1115
+ b.row.actor?.name ? (m(), w(t(Je), {
1116
+ key: 0,
1117
+ name: b.row.actor.name,
1118
+ size: "sm"
1119
+ }, null, 8, ["name"])) : (m(), w(t(D), {
1120
+ key: 1,
1121
+ tone: "anchor",
1122
+ icon: "edit"
1123
+ }))
1124
+ ])
1125
+ ]),
1126
+ sub: p(() => [
1127
+ g("span", on, [
1128
+ b.row.actor ? (m(), k(U, { key: 0 }, [
1129
+ g("span", an, _(b.row.actor.name || t(s)("core.account.somebody_else")), 1),
1130
+ f[0] || (f[0] = g("span", { "aria-hidden": "true" }, "·", -1))
1131
+ ], 64)) : S("", !0),
1132
+ (m(!0), k(U, null, W(b.details, (x, y) => (m(), k(U, { key: y }, [
1133
+ typeof x != "string" ? (m(), w(t(ze), {
1134
+ key: 0,
1135
+ to: x.to,
1136
+ class: "text-content-link",
1137
+ "data-change-link": ""
1138
+ }, {
1139
+ default: p(() => [
1140
+ T(_(x.text), 1)
1141
+ ]),
1142
+ _: 2
1143
+ }, 1032, ["to"])) : (m(), k("span", rn, _(x), 1)),
1144
+ f[1] || (f[1] = g("span", { "aria-hidden": "true" }, "·", -1))
1145
+ ], 64))), 128)),
1146
+ g("span", null, _(t(r).dateTime(b.row.created_at)), 1)
1147
+ ])
1148
+ ]),
1149
+ _: 2
1150
+ }, 1032, ["label"]))), 128))
1151
+ ]),
1152
+ _: 1
1153
+ }));
1154
+ }
1155
+ }), us = /* @__PURE__ */ E({
1156
+ __name: "SignInAsButton",
1157
+ props: {
1158
+ userId: {},
1159
+ name: {},
1160
+ permission: {}
1161
+ },
1162
+ setup(e) {
1163
+ const n = e, { t: s } = C(), o = R(), c = ge(), { home: r } = be(), d = G(), a = ie(!1), l = P(() => {
1164
+ const f = H(o.session.state.value);
1165
+ return f !== null && f.impersonator === void 0 && f.user.id !== n.userId;
1166
+ });
1167
+ async function u() {
1168
+ a.value = !0;
1169
+ try {
1170
+ await nt(o, n.userId), await c.push(r);
1171
+ } catch (f) {
1172
+ Q(f) || j.error(d(f, { fallback: s("core.identity.impersonation.sign_in_as_failed", { name: n.name }) }));
1173
+ } finally {
1174
+ a.value = !1;
1175
+ }
1176
+ }
1177
+ return (f, b) => l.value ? (m(), w(t(Qe), {
1178
+ key: 0,
1179
+ permission: n.permission
1180
+ }, {
1181
+ default: p(() => [
1182
+ v(t(z), {
1183
+ processing: a.value,
1184
+ "data-sign-in-as": "",
1185
+ onClick: u
1186
+ }, {
1187
+ default: p(() => [
1188
+ T(_(t(s)("core.identity.impersonation.sign_in_as", { name: n.name })), 1)
1189
+ ]),
1190
+ _: 1
1191
+ }, 8, ["processing"])
1192
+ ]),
1193
+ _: 1
1194
+ }, 8, ["permission"])) : S("", !0);
1195
+ }
1196
+ }), [cn, ds] = B("vue-core.serviceaccounts"), de = "iam.serviceaccount:view", ms = "iam.serviceaccount:manage", ps = "iam.serviceaccount:revoke", me = Y({
1197
+ index: { name: "serviceaccounts.index", path: "/iam/service-accounts", component: () => import("./ServiceAccountsList-BM7GGcvw.js"), meta: { access: de, titleKey: "core.serviceaccounts.title_plural" } },
1198
+ record: {
1199
+ name: "serviceaccounts.record",
1200
+ path: "/iam/service-accounts/:id",
1201
+ component: () => import("./ServiceAccountRecord-gtlhYaAz.js"),
1202
+ meta: { access: de, titleKey: "core.serviceaccounts.title_plural", remountOnParam: "id" }
1203
+ }
1204
+ });
1205
+ function fs(e = {}) {
1206
+ return se({
1207
+ id: "serviceaccounts",
1208
+ routes: me.records,
1209
+ context: oe(cn, { tenants: e.tenants ?? null }),
1210
+ navigation: e.destination ? [{ destination: e.destination, to: me.index, within: ["serviceaccounts.record"] }] : [],
1211
+ requires: ["access"]
1212
+ });
1213
+ }
1214
+ export {
1215
+ Wn as A,
1216
+ Xn as B,
1217
+ Tt as C,
1218
+ et as D,
1219
+ $t as E,
1220
+ ke as F,
1221
+ st as G,
1222
+ fs as H,
1223
+ tt as I,
1224
+ nt as J,
1225
+ ts as K,
1226
+ es as M,
1227
+ At as P,
1228
+ ps as R,
1229
+ Ft as U,
1230
+ us as _,
1231
+ mt as a,
1232
+ ns as b,
1233
+ Se as c,
1234
+ ss as d,
1235
+ Jn as e,
1236
+ Ut as f,
1237
+ Ot as g,
1238
+ Q as h,
1239
+ O as i,
1240
+ Zn as j,
1241
+ as as k,
1242
+ cs as l,
1243
+ is as m,
1244
+ ls as n,
1245
+ ds as o,
1246
+ ms as p,
1247
+ me as q,
1248
+ Qn as r,
1249
+ os as s,
1250
+ Yn as t,
1251
+ be as u,
1252
+ rs as v,
1253
+ Kt as w,
1254
+ jt as x,
1255
+ kt as y,
1256
+ Hn as z
1257
+ };