@wssto2/vue-core 0.5.3 → 0.6.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 (90) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +3 -1
  3. package/dist/{ActionRow.vue_vue_type_script_setup_true_lang-Bv-APkGf.js → ActionRow.vue_vue_type_script_setup_true_lang-D8NCXX4p.js} +1 -1
  4. package/dist/{Activity-DUjDaPfP.js → Activity-DGodh6BU.js} +4 -4
  5. package/dist/{Changes-B0tZO6BZ.js → Changes-38u4xY6e.js} +3 -3
  6. package/dist/{CollectionPage.vue_vue_type_script_setup_true_lang-o_Pj-JcD.js → CollectionPage.vue_vue_type_script_setup_true_lang-DPcCnrjr.js} +3 -3
  7. package/dist/{DateField.vue_vue_type_script_setup_true_lang-CDg31ZU7.js → DateField.vue_vue_type_script_setup_true_lang-BxUuUypB.js} +1 -1
  8. package/dist/{DeadLetters-IgVHao84.js → DeadLetters-CeHfhFHP.js} +6 -5
  9. package/dist/{FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js → FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js} +1 -1
  10. package/dist/{FormView.vue_vue_type_script_setup_true_lang-D31Hk3pJ.js → FormView.vue_vue_type_script_setup_true_lang-nyz8EkzM.js} +1 -1
  11. package/dist/{General-C40HxupS.js → General-BNTjPvat.js} +6 -6
  12. package/dist/{NewRolePage-Bhy8KJO1.js → NewRolePage-Btg7gzzH.js} +7 -6
  13. package/dist/{NumberField.vue_vue_type_script_setup_true_lang-BdS7BxuS.js → NumberField.vue_vue_type_script_setup_true_lang-C8um4ARi.js} +1 -1
  14. package/dist/PersonAccess.vue_vue_type_script_setup_true_lang-ClmawvYm.js +600 -0
  15. package/dist/{ProfilePage-Bf7dFzGd.js → ProfilePage-CoZyG11N.js} +9 -9
  16. package/dist/{RoleEditor.vue_vue_type_script_setup_true_lang-C6oloGIh.js → RoleEditor.vue_vue_type_script_setup_true_lang-Bs9bo0Zb.js} +30 -29
  17. package/dist/{RolePage-BjbvciTg.js → RolePage-CPlwZA6X.js} +37 -35
  18. package/dist/{RolesPage-DzVOgF4z.js → RolesPage-CdYdIHR4.js} +29 -27
  19. package/dist/{SegmentedField.vue_vue_type_script_setup_true_lang-DXe_iOS8.js → SegmentedField.vue_vue_type_script_setup_true_lang-B_hBL5f4.js} +1 -1
  20. package/dist/{SelectField.vue_vue_type_script_setup_true_lang-BN4vzvV9.js → SelectField.vue_vue_type_script_setup_true_lang-CBZhGNpm.js} +4 -4
  21. package/dist/ServiceAccountDialog.vue_vue_type_script_setup_true_lang-DuvSSBbX.js +126 -0
  22. package/dist/ServiceAccountRecord-BtaUZuWU.js +511 -0
  23. package/dist/ServiceAccountsList-CcRJvNaf.js +137 -0
  24. package/dist/{SessionList.vue_vue_type_script_setup_true_lang-PuWIK-Wa.js → SessionList.vue_vue_type_script_setup_true_lang-VvBB2EZz.js} +2 -2
  25. package/dist/{Sessions-CRUObe5G.js → Sessions-DkGNO1FO.js} +2 -2
  26. package/dist/{SettingsPage-C0qEC0uI.js → SettingsPage-D4G1HGbG.js} +8 -8
  27. package/dist/{SignIn-Uy0Jujzz.js → SignIn-DS1YymqD.js} +4 -4
  28. package/dist/{SignInPage-CpVZfrLZ.js → SignInPage-BrmL0PUw.js} +3 -3
  29. package/dist/{SignIns-Cp5Gx2dk.js → SignIns-C7l7IPHQ.js} +1 -1
  30. package/dist/{SwitchField.vue_vue_type_script_setup_true_lang-Dj5Aq8QT.js → SwitchField.vue_vue_type_script_setup_true_lang-DXZK89A3.js} +1 -1
  31. package/dist/{TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js → TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js} +2 -2
  32. package/dist/{TextareaField.vue_vue_type_script_setup_true_lang-aT1P8Xqr.js → TextareaField.vue_vue_type_script_setup_true_lang-BOtn_1GT.js} +1 -1
  33. package/dist/{TimeField.vue_vue_type_script_setup_true_lang-jPKPE1hc.js → TimeField.vue_vue_type_script_setup_true_lang-CbflIrq6.js} +1 -1
  34. package/dist/{UserRecord-DbSMnTbj.js → UserRecord-Du8M_kuk.js} +25 -25
  35. package/dist/{UsersList-9MicE2pG.js → UsersList-D3ydQice.js} +13 -13
  36. package/dist/access/api.d.ts +7 -8
  37. package/dist/access/context.d.ts +2 -7
  38. package/dist/access/feature.d.ts +0 -8
  39. package/dist/access/index.js +47 -15
  40. package/dist/client/client.d.ts +2 -2
  41. package/dist/client/index.d.ts +1 -1
  42. package/dist/client/route.d.ts +22 -3
  43. package/dist/collection/http.d.ts +3 -2
  44. package/dist/collection/index.js +17 -16
  45. package/dist/form/index.js +586 -611
  46. package/dist/http-nz92KjdS.js +42 -0
  47. package/dist/i18n/index.js +32 -32
  48. package/dist/identity/index.d.ts +7 -0
  49. package/dist/identity/index.js +19 -15
  50. package/dist/identity/serviceaccounts/ApiKeysPanel.vue.d.ts +17 -0
  51. package/dist/identity/serviceaccounts/CreatedApiKeyDialog.vue.d.ts +53 -0
  52. package/dist/identity/serviceaccounts/NewApiKeyDialog.vue.d.ts +24 -0
  53. package/dist/identity/serviceaccounts/ServiceAccountDialog.vue.d.ts +22 -0
  54. package/dist/identity/serviceaccounts/ServiceAccountRecord.vue.d.ts +2 -0
  55. package/dist/identity/serviceaccounts/ServiceAccountsList.vue.d.ts +2 -0
  56. package/dist/identity/serviceaccounts/access.d.ts +4 -0
  57. package/dist/identity/serviceaccounts/api.d.ts +27 -0
  58. package/dist/identity/serviceaccounts/context.d.ts +14 -0
  59. package/dist/identity/serviceaccounts/feature.d.ts +23 -0
  60. package/dist/identity/serviceaccounts/form.d.ts +4 -0
  61. package/dist/identity/serviceaccounts/messages.d.ts +11 -0
  62. package/dist/identity/serviceaccounts/routes.d.ts +22 -0
  63. package/dist/{index-Ok29ucE3.js → index-Cmj9iZmT.js} +191 -168
  64. package/dist/{index-C-oM_Mnf.js → index-DH0MoFqg.js} +2 -2
  65. package/dist/index.d.ts +1 -1
  66. package/dist/index.js +1 -1
  67. package/dist/internal/copyText.d.ts +5 -0
  68. package/dist/modules/access/routes.d.ts +13 -13
  69. package/dist/modules/events/routes.d.ts +4 -4
  70. package/dist/modules/identity/routes.d.ts +31 -31
  71. package/dist/modules/notification/routes.d.ts +16 -16
  72. package/dist/modules/serviceaccount/entities.d.ts +127 -0
  73. package/dist/modules/serviceaccount/routes.d.ts +58 -0
  74. package/dist/modules/serviceaccount/schemas.d.ts +49 -0
  75. package/dist/{neighbors-Bv6vnWlW.js → neighbors-DNZuGlQH.js} +1 -1
  76. package/dist/notifications/index.js +1 -1
  77. package/dist/{options-Bu0XbEpN.js → options-e_CAfvDQ.js} +3 -3
  78. package/dist/phone/index.js +1 -1
  79. package/dist/refusals-COPr15XZ.js +135 -0
  80. package/dist/routes-CVckt7Pj.js +19 -0
  81. package/dist/state-BC1Fc6U2.js +154 -0
  82. package/dist/{status-C78NpXyB.js → status-C8XtnK6m.js} +7 -6
  83. package/dist/styles.css +1 -1
  84. package/dist/{suggestions-ClyLexMO.js → suggestions-cPjs5gQz.js} +1 -1
  85. package/dist/{useCommand-DyuPTosF.js → useCommand-CfG727e8.js} +1 -1
  86. package/dist/{useGroupSheet-C2NyqWRp.js → useGroupSheet-BVcNDWbP.js} +2 -2
  87. package/dist/useRecordDialog-D65FF85F.js +30 -0
  88. package/package.json +2 -2
  89. package/dist/http-CdQowFlW.js +0 -194
  90. package/dist/index-BdGnA1Jh.js +0 -765
@@ -1,30 +1,31 @@
1
1
  import { route as i } from "./client/index.js";
2
- import { d as j, p as W } from "./feature-DdUAfyi4.js";
3
- import { k as re } from "./keepAlive-z3IRFkQq.js";
4
- import { d as G } from "./defineRoutes-BGAdiIrt.js";
5
- import { d as R } from "./context-Ch1r4fdN.js";
6
- import { defineComponent as w, computed as g, watch as q, openBlock as _, createElementBlock as D, ref as F, useTemplateRef as ae, watchEffect as ce, onBeforeUnmount as ue, createVNode as v, unref as o, createElementVNode as p, toDisplayString as f, createCommentVNode as I, createBlock as K, useId as le, Teleport as me, normalizeClass as B, createTextVNode as C, withCtx as T, mergeProps as pe, h as de } from "vue";
2
+ import { d as N, p as F } from "./feature-DdUAfyi4.js";
3
+ import { k as ce } from "./keepAlive-z3IRFkQq.js";
4
+ import { d as K } from "./defineRoutes-BGAdiIrt.js";
5
+ import { d as A } from "./context-Ch1r4fdN.js";
6
+ import { defineComponent as w, computed as y, watch as z, openBlock as _, createElementBlock as D, ref as V, useTemplateRef as ue, watchEffect as le, onBeforeUnmount as me, createVNode as g, unref as o, createElementVNode as p, toDisplayString as f, createCommentVNode as I, createBlock as U, useId as pe, Teleport as de, normalizeClass as B, createTextVNode as O, withCtx as T, mergeProps as fe, h as he } from "vue";
7
7
  import { i as P } from "./error-Bb_dr_Ay.js";
8
- import { u as fe } from "./environment-Dva-SG8D.js";
9
- import { u as A } from "./describeError-BqGAUZgX.js";
8
+ import { u as ve } from "./environment-Dva-SG8D.js";
9
+ import { u as C } from "./describeError-BqGAUZgX.js";
10
10
  import { t as k } from "./toast-CqSDTWRX.js";
11
- import { u as x, h as O, f as M } from "./platform-Dx6STiwY.js";
11
+ import { u as x, h as R, f as j } from "./platform-Dx6STiwY.js";
12
12
  import { useI18n as E } from "vue-i18n";
13
- import { _ as H } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
14
- import { useRouter as Y, useRoute as he } from "vue-router";
15
- import { _ as J } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-CPeNxh5K.js";
16
- import { _ as z } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
17
- import { u as ye } from "./leaveGuard-Cc8yeLxM.js";
18
- import { _ as ge } from "./FormView.vue_vue_type_script_setup_true_lang-D31Hk3pJ.js";
19
- import { _ as ve } from "./TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js";
20
- import { u as _e } from "./mediaQuery-CygcXmFW.js";
21
- import { u as be } from "./useDialog-CXR3hN0G.js";
22
- import { c as we } from "./closeOverlays-CjVsIrpL.js";
23
- import { u as xe } from "./FormErrors.vue_vue_type_script_setup_true_lang-D7edzNTL.js";
24
- import { u as Ee } from "./format-D8X4zsx6.js";
25
- import { b as Se } from "./routeResource-CcYA75T2.js";
26
- import "./ActionRow.vue_vue_type_script_setup_true_lang-Bv-APkGf.js";
27
- import { _ as Te } from "./AccessGate.vue_vue_type_script_setup_true_lang-DZ9GcLC1.js";
13
+ import { _ as J } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
14
+ import { useRouter as Q, useRoute as ye } from "vue-router";
15
+ import { _ as X } from "./AccountMenuItem.vue_vue_type_script_setup_true_lang-CPeNxh5K.js";
16
+ import { _ as G } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
17
+ import { u as ge } from "./leaveGuard-Cc8yeLxM.js";
18
+ import { _ as _e } from "./FormView.vue_vue_type_script_setup_true_lang-nyz8EkzM.js";
19
+ import { _ as be } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
20
+ import { u as we } from "./mediaQuery-CygcXmFW.js";
21
+ import { u as xe } from "./useDialog-CXR3hN0G.js";
22
+ import { c as Ee } from "./closeOverlays-CjVsIrpL.js";
23
+ import { u as Se } from "./FormErrors.vue_vue_type_script_setup_true_lang-D7edzNTL.js";
24
+ import { u as Te } from "./format-D8X4zsx6.js";
25
+ import { b as ke } from "./routeResource-CcYA75T2.js";
26
+ import "./ActionRow.vue_vue_type_script_setup_true_lang-D8NCXX4p.js";
27
+ import { _ as Ae } from "./AccessGate.vue_vue_type_script_setup_true_lang-DZ9GcLC1.js";
28
+ import "./routes-CVckt7Pj.js";
28
29
  const b = {
29
30
  login: i("POST", "/v1/auth/login", { public: !0 }),
30
31
  refresh: i("POST", "/v1/auth/refresh", { public: !0 }),
@@ -57,37 +58,37 @@ const b = {
57
58
  profileSignins: i("GET", "/v1/iam/profile/signins"),
58
59
  profileSessions: i("GET", "/v1/iam/profile/sessions"),
59
60
  profileRevokeSession: i("DELETE", "/v1/iam/profile/sessions/:session_id")
60
- }, [ke, Q] = R("vue-core.identity"), $ = (e) => P(e) && e.kind === "unauthorized";
61
- function Pe(e) {
61
+ }, [Pe, Z] = A("vue-core.identity"), $ = (e) => P(e) && e.kind === "unauthorized";
62
+ function Ce(e) {
62
63
  if (!P(e) || e.code !== "identity.signin.locked") return null;
63
64
  const s = e.params?.locked_until, t = typeof s == "string" ? new Date(s) : null;
64
65
  return t && !Number.isNaN(t.getTime()) ? t : null;
65
66
  }
66
- async function Ae({ http: e, session: s }, t) {
67
- await e.request(b.login, t, { handleUnauthorized: !1 }), await N({ session: s });
67
+ async function Oe({ http: e, session: s }, t) {
68
+ await e.request(b.login, t, { handleUnauthorized: !1 }), await M({ session: s });
68
69
  }
69
- async function N({ session: e }) {
70
+ async function M({ session: e }) {
70
71
  const s = await e.refresh();
71
72
  if (s.status === "failed") throw s.error;
72
73
  if (s.status !== "authenticated") throw new Error("The server accepted the request but reports nobody signed in.");
73
74
  }
74
- async function Ce(e, s) {
75
- await e.http.request(b.loginAs, { user_id: s }), await N(e);
75
+ async function Re(e, s) {
76
+ await e.http.request(b.loginAs, { user_id: s }), await M(e);
76
77
  }
77
- async function Oe(e) {
78
- await e.http.request(b.loginAsReturn), await N(e);
78
+ async function Ke(e) {
79
+ await e.http.request(b.loginAsReturn), await M(e);
79
80
  }
80
- const Re = { hidden: "" }, Ie = /* @__PURE__ */ w({
81
+ const Ie = { hidden: "" }, Ue = /* @__PURE__ */ w({
81
82
  __name: "LocaleSync",
82
83
  setup(e) {
83
- const { http: s, session: t } = x(), n = fe(), m = A(), d = g(() => {
84
+ const { http: s, session: t } = x(), n = ve(), m = C(), d = y(() => {
84
85
  const r = t.state.value, a = r.status === "authenticated" ? r.user.locale : void 0;
85
86
  return typeof a == "string" ? a : null;
86
87
  });
87
88
  let u = null;
88
- return q(d, async (r) => {
89
+ return z(d, async (r) => {
89
90
  u = r, r !== null && r !== n.locale.value && n.locales.includes(r) && await n.setLocale(r);
90
- }, { immediate: !0 }), q(n.locale, async (r) => {
91
+ }, { immediate: !0 }), z(n.locale, async (r) => {
91
92
  if (!(t.state.value.status !== "authenticated" || r === u))
92
93
  try {
93
94
  await s.request(b.changeLocale, { locale: r }), u = r;
@@ -95,15 +96,15 @@ const Re = { hidden: "" }, Ie = /* @__PURE__ */ w({
95
96
  if ($(a)) return;
96
97
  k.error(m(a)), P(a) && a.code === "identity.locale.unsupported" && u !== null && await n.setLocale(u);
97
98
  }
98
- }), (r, a) => (_(), D("span", Re));
99
+ }), (r, a) => (_(), D("span", Ie));
99
100
  }
100
101
  });
101
- function X() {
102
- const e = x(), s = Y(), { home: t } = Q(), n = A(), m = F(!1), d = g(() => O(e.session.state.value)?.impersonator != null);
102
+ function ee() {
103
+ const e = x(), s = Q(), { home: t } = Z(), n = C(), m = V(!1), d = y(() => R(e.session.state.value)?.impersonator != null);
103
104
  async function u() {
104
105
  m.value = !0;
105
106
  try {
106
- await Oe(e), await s.push(t);
107
+ await Ke(e), await s.push(t);
107
108
  } catch (r) {
108
109
  $(r) || k.error(n(r)), e.session.refresh();
109
110
  } finally {
@@ -112,22 +113,22 @@ function X() {
112
113
  }
113
114
  return { impersonating: d, returning: m, leave: u };
114
115
  }
115
- const Ke = { class: "min-w-0 flex-1" }, $e = { class: "hidden md:inline" }, Ue = { class: "md:hidden" }, Le = ["disabled"], qe = /* @__PURE__ */ w({
116
+ const $e = { class: "min-w-0 flex-1" }, Le = { class: "hidden md:inline" }, qe = { class: "md:hidden" }, ze = ["disabled"], Ge = /* @__PURE__ */ w({
116
117
  __name: "ImpersonationBanner",
117
118
  setup(e) {
118
- const { t: s } = E(), t = x(), { returning: n, leave: m } = X(), d = g(() => O(t.session.state.value)?.impersonator ?? null), u = g(() => {
119
- const l = O(t.session.state.value)?.user;
119
+ const { t: s } = E(), t = x(), { returning: n, leave: m } = ee(), d = y(() => R(t.session.state.value)?.impersonator ?? null), u = y(() => {
120
+ const l = R(t.session.state.value)?.user;
120
121
  return typeof l?.name == "string" ? l.name : typeof l?.login == "string" ? l.login : String(l?.id ?? "");
121
- }), r = ae("strip");
122
+ }), r = ue("strip");
122
123
  let a = null;
123
- return ce(() => {
124
+ return le(() => {
124
125
  a?.disconnect(), a = null;
125
126
  const l = r.value;
126
127
  if (!l) return void document.documentElement.style.removeProperty("--shell-banner-h");
127
128
  if (typeof ResizeObserver > "u") return;
128
129
  const c = () => document.documentElement.style.setProperty("--shell-banner-h", `${l.offsetHeight}px`);
129
130
  a = new ResizeObserver(c), a.observe(l), c();
130
- }, { flush: "post" }), ue(() => {
131
+ }, { flush: "post" }), me(() => {
131
132
  a?.disconnect(), document.documentElement.style.removeProperty("--shell-banner-h");
132
133
  }), (l, c) => d.value ? (_(), D("div", {
133
134
  key: 0,
@@ -137,14 +138,14 @@ const Ke = { class: "min-w-0 flex-1" }, $e = { class: "hidden md:inline" }, Ue =
137
138
  "data-impersonation-banner": "",
138
139
  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)]"
139
140
  }, [
140
- v(o(H), {
141
+ g(o(J), {
141
142
  name: "informationLine",
142
143
  size: 18,
143
144
  class: "shrink-0 compact:hidden"
144
145
  }),
145
- p("span", Ke, [
146
- p("span", $e, f(o(s)("core.identity.impersonation.banner", { name: u.value })), 1),
147
- p("span", Ue, f(o(s)("core.identity.impersonation.banner_short", { name: u.value })), 1)
146
+ p("span", $e, [
147
+ p("span", Le, f(o(s)("core.identity.impersonation.banner", { name: u.value })), 1),
148
+ p("span", qe, f(o(s)("core.identity.impersonation.banner_short", { name: u.value })), 1)
148
149
  ]),
149
150
  p("button", {
150
151
  type: "button",
@@ -152,14 +153,14 @@ const Ke = { class: "min-w-0 flex-1" }, $e = { class: "hidden md:inline" }, Ue =
152
153
  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",
153
154
  onClick: c[0] || (c[0] = //@ts-ignore
154
155
  (...h) => o(m) && o(m)(...h))
155
- }, f(o(s)("core.identity.impersonation.return")), 9, Le)
156
+ }, f(o(s)("core.identity.impersonation.return")), 9, ze)
156
157
  ], 512)) : I("", !0);
157
158
  }
158
- }), ze = /* @__PURE__ */ w({
159
+ }), Ne = /* @__PURE__ */ w({
159
160
  __name: "ReturnMenuItem",
160
161
  setup(e) {
161
- const { t: s } = E(), { impersonating: t, leave: n } = X();
162
- return (m, d) => o(t) ? (_(), K(J, {
162
+ const { t: s } = E(), { impersonating: t, leave: n } = ee();
163
+ return (m, d) => o(t) ? (_(), U(X, {
163
164
  key: 0,
164
165
  label: o(s)("core.identity.impersonation.return"),
165
166
  icon: "logoutBoxRLine",
@@ -168,8 +169,8 @@ const Ke = { class: "min-w-0 flex-1" }, $e = { class: "hidden md:inline" }, Ue =
168
169
  }, null, 8, ["label", "onClick"])) : I("", !0);
169
170
  }
170
171
  });
171
- function Ge(e = {}) {
172
- const { t: s } = E(), t = x(), n = Ee(), m = A(), u = xe({
172
+ function Fe(e = {}) {
173
+ const { t: s } = E(), t = x(), n = Te(), m = C(), u = Se({
173
174
  defaults: () => ({ login: e.login ?? "", password: "" }),
174
175
  validator: {
175
176
  safeParse(a) {
@@ -178,36 +179,36 @@ function Ge(e = {}) {
178
179
  }
179
180
  },
180
181
  failureMessage(a, l) {
181
- const c = Pe(l);
182
+ const c = Ce(l);
182
183
  return c ? s("core.errors.identity.signin.locked", { locked_until: n.time(c) }) : P(l) ? m(l) : void 0;
183
184
  }
184
- }), r = g(() => u.errors.first("password") ?? (u.failure.value?.error ? u.failure.value.message : void 0));
185
- return { form: u, passwordError: r, submit: async () => (await u.submit((a) => Ae(t, a))).status === "saved" };
185
+ }), r = y(() => u.errors.first("password") ?? (u.failure.value?.error ? u.failure.value.message : void 0));
186
+ return { form: u, passwordError: r, submit: async () => (await u.submit((a) => Oe(t, a))).status === "saved" };
186
187
  }
187
- const De = ["aria-labelledby"], Fe = ["id"], Ne = { class: "mt-1 text-subheadline text-content-muted" }, Be = { class: "flex items-center gap-2 rounded-control bg-status-success-surface px-2.5 py-2 text-footnote text-status-success-content" }, Me = { class: "flex flex-col gap-1.5" }, Ve = { class: "text-footnote text-content-muted" }, je = {
188
+ const De = ["aria-labelledby"], Ve = ["id"], Me = { class: "mt-1 text-subheadline text-content-muted" }, Be = { class: "flex items-center gap-2 rounded-control bg-status-success-surface px-2.5 py-2 text-footnote text-status-success-content" }, je = { class: "flex flex-col gap-1.5" }, We = { class: "text-footnote text-content-muted" }, Ye = {
188
189
  class: "rounded-control bg-fill px-2.5 py-2 text-body text-content-muted",
189
190
  "data-expiry-login": ""
190
- }, We = /* @__PURE__ */ w({
191
+ }, He = /* @__PURE__ */ w({
191
192
  __name: "SessionExpiry",
192
193
  setup(e) {
193
- const { t: s } = E(), { session: t } = x(), n = he(), m = ye(), d = A(), u = _e(), r = le(), a = g(() => {
194
- const y = t.state.value, S = y.status === "anonymous" && y.reason === "expired" ? y.previous?.user : void 0;
194
+ const { t: s } = E(), { session: t } = x(), n = ye(), m = ge(), d = C(), u = we(), r = pe(), a = y(() => {
195
+ const v = t.state.value, S = v.status === "anonymous" && v.reason === "expired" ? v.previous?.user : void 0;
195
196
  return typeof S?.login == "string" ? S.login : null;
196
- }), l = g(() => a.value !== null && n.meta.public !== !0), c = F(null), h = be(c, { onEscape: () => {
197
- } }), { isOpen: te } = h, { form: U, passwordError: ne, submit: oe } = Ge({ login: a.value ?? "" });
198
- q(l, (y) => {
199
- y ? (U.hydrate({ login: a.value ?? "", password: "" }), we(), k.dismiss(), h.present()) : h.dismissWithoutAsking();
197
+ }), l = y(() => a.value !== null && n.meta.public !== !0), c = V(null), h = xe(c, { onEscape: () => {
198
+ } }), { isOpen: oe } = h, { form: L, passwordError: ie, submit: re } = Fe({ login: a.value ?? "" });
199
+ z(l, (v) => {
200
+ v ? (L.hydrate({ login: a.value ?? "", password: "" }), Ee(), k.dismiss(), h.present()) : h.dismissWithoutAsking();
200
201
  }, { immediate: !0, flush: "post" });
201
- async function ie() {
202
+ async function ae() {
202
203
  if (!(m.hasUnsavedChanges() && !await m.confirm()))
203
204
  try {
204
205
  await t.signOut();
205
- } catch (y) {
206
- $(y) || k.error(d(y));
206
+ } catch (v) {
207
+ $(v) || k.error(d(v));
207
208
  }
208
209
  }
209
- return (y, S) => (_(), K(me, { to: "body" }, [
210
- o(te) ? (_(), D("div", {
210
+ return (v, S) => (_(), U(de, { to: "body" }, [
211
+ o(oe) ? (_(), D("div", {
211
212
  key: 0,
212
213
  class: "relative z-10000",
213
214
  role: "alertdialog",
@@ -232,51 +233,51 @@ const De = ["aria-labelledby"], Fe = ["id"], Ne = { class: "mt-1 text-subheadlin
232
233
  p("h2", {
233
234
  id: o(r),
234
235
  class: "text-headline font-semibold text-content-strong"
235
- }, f(o(s)("core.identity.expired.title")), 9, Fe),
236
- p("p", Ne, f(o(s)("core.identity.expired.body")), 1)
236
+ }, f(o(s)("core.identity.expired.title")), 9, Ve),
237
+ p("p", Me, f(o(s)("core.identity.expired.body")), 1)
237
238
  ]),
238
239
  p("p", Be, [
239
- v(o(H), {
240
+ g(o(J), {
240
241
  name: "checkboxCircleFill",
241
242
  size: 16,
242
243
  class: "shrink-0"
243
244
  }),
244
- C(" " + f(o(s)("core.identity.expired.kept")), 1)
245
+ O(" " + f(o(s)("core.identity.expired.kept")), 1)
245
246
  ]),
246
- v(o(ge), { onSubmit: o(oe) }, {
247
+ g(o(_e), { onSubmit: o(re) }, {
247
248
  default: T(() => [
248
- p("div", Me, [
249
- p("span", Ve, f(o(s)("core.identity.username")), 1),
250
- p("span", je, f(a.value), 1)
249
+ p("div", je, [
250
+ p("span", We, f(o(s)("core.identity.username")), 1),
251
+ p("span", Ye, f(a.value), 1)
251
252
  ]),
252
- v(o(ve), pe(o(U).bind("password"), {
253
+ g(o(be), fe(o(L).bind("password"), {
253
254
  label: o(s)("core.identity.signin.password"),
254
255
  type: "password",
255
256
  autocomplete: "current-password",
256
257
  required: "",
257
- error: o(ne)
258
+ error: o(ie)
258
259
  }), null, 16, ["label", "error"]),
259
- v(o(z), {
260
+ g(o(G), {
260
261
  type: "submit",
261
262
  prominence: "primary",
262
263
  class: "w-full",
263
- processing: o(U).submitting.value
264
+ processing: o(L).submitting.value
264
265
  }, {
265
266
  default: T(() => [
266
- C(f(o(s)("core.identity.signin.submit")), 1)
267
+ O(f(o(s)("core.identity.signin.submit")), 1)
267
268
  ]),
268
269
  _: 1
269
270
  }, 8, ["processing"])
270
271
  ]),
271
272
  _: 1
272
273
  }, 8, ["onSubmit"]),
273
- v(o(z), {
274
+ g(o(G), {
274
275
  prominence: "plain",
275
276
  class: "self-center",
276
- onClick: ie
277
+ onClick: ae
277
278
  }, {
278
279
  default: T(() => [
279
- C(f(o(s)("core.identity.expired.sign_out")), 1)
280
+ O(f(o(s)("core.identity.expired.sign_out")), 1)
280
281
  ]),
281
282
  _: 1
282
283
  })
@@ -285,48 +286,48 @@ const De = ["aria-labelledby"], Fe = ["id"], Ne = { class: "mt-1 text-subheadlin
285
286
  ], 8, De)) : I("", !0)
286
287
  ]));
287
288
  }
288
- }), He = G({
289
- login: { name: "login", path: "/login", component: () => import("./SignInPage-CpVZfrLZ.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
289
+ }), Je = K({
290
+ login: { name: "login", path: "/login", component: () => import("./SignInPage-BrmL0PUw.js"), meta: { public: !0, titleKey: "core.identity.signin.title" } }
290
291
  });
291
- function Rs(e = {}) {
292
- return j({
292
+ function $s(e = {}) {
293
+ return N({
293
294
  id: "identity",
294
- routes: He.records,
295
- context: W(ke, { home: e.home ?? "/" }),
295
+ routes: Je.records,
296
+ context: F(Pe, { home: e.home ?? "/" }),
296
297
  holdsExpiredSession: !0,
297
298
  contributions: [
298
299
  // Not optional: a shell without a `host` could not ask for the password, and the person would be stuck on a dead page.
299
- { id: "identity.expiry", slot: "host", component: We, scope: "always" },
300
+ { id: "identity.expiry", slot: "host", component: He, scope: "always" },
300
301
  // Not optional either: acting as somebody else must always be visible.
301
- { id: "identity.impersonation", slot: "banner", component: qe, scope: "authenticated" },
302
+ { id: "identity.impersonation", slot: "banner", component: Ge, scope: "authenticated" },
302
303
  // The same way out in the account menu (a shell without that slot shows only the banner's button).
303
- { id: "identity.return", slot: "accountMenu", component: ze, scope: "authenticated", optional: !0, order: -20 },
304
- { id: "identity.locale", slot: "host", component: Ie, scope: "authenticated", optional: !0 }
304
+ { id: "identity.return", slot: "accountMenu", component: Ne, scope: "authenticated", optional: !0, order: -20 },
305
+ { id: "identity.locale", slot: "host", component: Ue, scope: "authenticated", optional: !0 }
305
306
  ],
306
- effects: [re()]
307
+ effects: [ce()]
307
308
  });
308
309
  }
309
- const Ye = (e) => typeof e == "object" && e !== null && !Array.isArray(e), Je = (e) => {
310
- if (!Ye(e)) throw new TypeError("expected an object");
310
+ const Qe = (e) => typeof e == "object" && e !== null && !Array.isArray(e), Xe = (e) => {
311
+ if (!Qe(e)) throw new TypeError("expected an object");
311
312
  if (typeof e.id != "number") throw new TypeError("id: expected a number");
312
313
  for (const s of ["login", "name", "email", "locale"])
313
314
  if (typeof e[s] != "string") throw new TypeError(`${s}: expected a string`);
314
315
  return { id: e.id, login: e.login, name: e.name, email: e.email, locale: e.locale };
315
- }, L = (e) => P(e) && e.kind === "unauthorized", Z = (e, s) => e.request(b.refresh, { refresh_token: "" }, { signal: s, handleUnauthorized: !1 });
316
- function Qe(e, s) {
316
+ }, q = (e) => P(e) && e.kind === "unauthorized", se = (e, s) => e.request(b.refresh, { refresh_token: "" }, { signal: s, handleUnauthorized: !1 });
317
+ function Ze(e, s) {
317
318
  return {
318
319
  async load(t) {
319
320
  try {
320
321
  const { data: n } = await e.request(b.me, void 0, { signal: t, handleUnauthorized: !1 });
321
- return M(n, s);
322
+ return j(n, s);
322
323
  } catch (n) {
323
- if (!L(n)) throw n;
324
+ if (!q(n)) throw n;
324
325
  }
325
326
  try {
326
- const { data: n } = await Z(e, t);
327
- return M(n, s);
327
+ const { data: n } = await se(e, t);
328
+ return j(n, s);
328
329
  } catch (n) {
329
- if (L(n)) return null;
330
+ if (q(n)) return null;
330
331
  throw n;
331
332
  }
332
333
  },
@@ -334,82 +335,82 @@ function Qe(e, s) {
334
335
  try {
335
336
  await e.request(b.logout, void 0, { handleUnauthorized: !1 });
336
337
  } catch (t) {
337
- if (!L(t)) throw t;
338
+ if (!q(t)) throw t;
338
339
  }
339
340
  }
340
341
  };
341
342
  }
342
- function Is(e) {
343
- const s = e?.parseUser ?? Je;
343
+ function Ls(e) {
344
+ const s = e?.parseUser ?? Xe;
344
345
  return {
345
- session: (n) => Qe(n, s),
346
+ session: (n) => Ze(n, s),
346
347
  ...e?.renewable && { renewable: e.renewable },
347
348
  async renewSession(n, m) {
348
349
  try {
349
- return await Z(m), (await n.refresh()).status === "authenticated";
350
+ return await se(m), (await n.refresh()).status === "authenticated";
350
351
  } catch {
351
352
  return !1;
352
353
  }
353
354
  }
354
355
  };
355
356
  }
356
- const ee = G({
357
- index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-Bf7dFzGd.js"), meta: { titleKey: "core.profile.title" } }
358
- }), Xe = /* @__PURE__ */ w({
357
+ const te = K({
358
+ index: { name: "profile", path: "/profile", component: () => import("./ProfilePage-CoZyG11N.js"), meta: { titleKey: "core.profile.title" } }
359
+ }), es = /* @__PURE__ */ w({
359
360
  __name: "ProfileMenuItem",
360
361
  setup(e) {
361
362
  const { t: s } = E();
362
- return (t, n) => (_(), K(J, {
363
+ return (t, n) => (_(), U(X, {
363
364
  label: o(s)("core.profile.menu"),
364
365
  icon: "user3Line",
365
- to: o(ee).index,
366
+ to: o(te).index,
366
367
  "data-profile-menu-item": ""
367
368
  }, null, 8, ["label", "to"]));
368
369
  }
369
- }), [Ze, Ks] = R("vue-core.users"), es = Symbol("vue-core.users.person"), [$s, Us] = R("vue-core.users.personActions"), [Ls, qs] = R("vue-core.users.personSessions");
370
- function ss(e) {
370
+ }), [ss, qs] = A("vue-core.users"), ts = Symbol("vue-core.users.person"), [zs, Gs] = A("vue-core.users.personActions"), [Ns, Fs] = A("vue-core.users.personSessions");
371
+ function ns(e) {
371
372
  const s = w({
372
373
  name: `PersonSection(${e.path})`,
373
374
  setup() {
374
- const t = Se(es);
375
- return () => t.data.value ? de(e.component, e.props?.(t.data.value) ?? {}) : null;
375
+ const t = ke(ts);
376
+ return () => t.data.value ? he(e.component, e.props?.(t.data.value) ?? {}) : null;
376
377
  }
377
378
  });
378
379
  return { name: `users.record.${e.path}`, path: e.path, component: s, meta: { ...e.meta } };
379
380
  }
380
- const V = "iam.user:view", zs = "iam.user:manage", ts = "iam.user.activity:view", se = G({
381
- index: { name: "users.index", path: "/users", component: () => import("./UsersList-9MicE2pG.js"), meta: { access: V, titleKey: "core.users.title" } },
381
+ const W = "iam.user:view", Ds = "iam.user:manage", os = "iam.user.activity:view", ne = K({
382
+ index: { name: "users.index", path: "/users", component: () => import("./UsersList-D3ydQice.js"), meta: { access: W, titleKey: "core.users.title" } },
382
383
  record: {
383
384
  name: "users.record",
384
385
  path: "/users/:id",
385
- component: () => import("./UserRecord-DbSMnTbj.js"),
386
- meta: { access: V, titleKey: "core.users.title", remountOnParam: "id" },
386
+ component: () => import("./UserRecord-Du8M_kuk.js"),
387
+ meta: { access: W, titleKey: "core.users.title", remountOnParam: "id" },
387
388
  children: [
388
- { name: "users.record.general", path: "general", component: () => import("./General-C40HxupS.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
389
- { name: "users.record.signin", path: "signin", component: () => import("./SignIn-Uy0Jujzz.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
390
- { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-CRUObe5G.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
391
- { name: "users.record.signins", path: "signins", component: () => import("./SignIns-Cp5Gx2dk.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
392
- { name: "users.record.changes", path: "changes", component: () => import("./Changes-B0tZO6BZ.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
393
- { name: "users.record.activity", path: "activity", component: () => import("./Activity-DUjDaPfP.js"), meta: { access: ts, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
389
+ { name: "users.record.general", path: "general", component: () => import("./General-BNTjPvat.js"), meta: { section: { labelKey: "core.users.sections.general", icon: "user3Line", groupKey: "core.users.section_groups.person" } } },
390
+ { name: "users.record.signin", path: "signin", component: () => import("./SignIn-DS1YymqD.js"), meta: { section: { labelKey: "core.users.sections.signin", icon: "key2Line", groupKey: "core.users.section_groups.access" } } },
391
+ { name: "users.record.sessions", path: "sessions", component: () => import("./Sessions-DkGNO1FO.js"), meta: { section: { labelKey: "core.users.sections.sessions", icon: "deviceLine", groupKey: "core.users.section_groups.access" } } },
392
+ { name: "users.record.signins", path: "signins", component: () => import("./SignIns-C7l7IPHQ.js"), meta: { section: { labelKey: "core.users.sections.signins", icon: "timeFill", groupKey: "core.users.section_groups.activity" } } },
393
+ { name: "users.record.changes", path: "changes", component: () => import("./Changes-38u4xY6e.js"), meta: { section: { labelKey: "core.users.sections.changes", icon: "edit", groupKey: "core.users.section_groups.activity" } } },
394
+ { name: "users.record.activity", path: "activity", component: () => import("./Activity-DGodh6BU.js"), meta: { access: os, section: { labelKey: "core.users.sections.activity", icon: "listCheck", groupKey: "core.users.section_groups.activity" } } }
394
395
  ]
395
396
  }
396
397
  });
397
- function ns(e) {
398
- return se.records.map((s) => s.name === "users.record" ? { ...s, children: [...s.children ?? [], ...e.map(ss)] } : s);
398
+ function is(e) {
399
+ return ne.records.map((s) => s.name === "users.record" ? { ...s, children: [...s.children ?? [], ...e.map(ns)] } : s);
399
400
  }
400
- function Gs(e = {}) {
401
+ function Vs(e = {}) {
401
402
  const s = e.people ?? !0, t = e.profile ?? !0, n = e.signInAs ?? "iam.user:impersonate";
402
- return j({
403
+ return N({
403
404
  id: "users",
404
- routes: [...s ? ns(e.sections ?? []) : [], ...t ? ee.records : []],
405
- context: W(Ze, { signInAs: n, activityAreas: e.activityAreas ?? {}, profileSections: e.profileSections ?? [] }),
406
- navigation: s && e.destination ? [{ destination: e.destination, to: se.index, within: ["users.record"] }] : [],
405
+ routes: [...s ? is(e.sections ?? []) : [], ...t ? te.records : []],
406
+ context: F(ss, { signInAs: n, activityAreas: e.activityAreas ?? {}, profileSections: e.profileSections ?? [] }),
407
+ navigation: s && e.destination ? [{ destination: e.destination, to: ne.index, within: ["users.record"] }] : [],
407
408
  // The entry of the account menu; a shell without that menu leaves it out.
408
- contributions: t ? [{ id: "users.profile", slot: "accountMenu", component: Xe, scope: "authenticated", optional: !0, order: -10 }] : [],
409
+ contributions: t ? [{ id: "users.profile", slot: "accountMenu", component: es, scope: "authenticated", optional: !0, order: -10 }] : [],
409
410
  requires: s && n !== !1 ? ["identity"] : []
410
411
  });
411
412
  }
412
- const Ds = /* @__PURE__ */ w({
413
+ const Ms = /* @__PURE__ */ w({
413
414
  __name: "SignInAsButton",
414
415
  props: {
415
416
  userId: {},
@@ -417,32 +418,32 @@ const Ds = /* @__PURE__ */ w({
417
418
  permission: {}
418
419
  },
419
420
  setup(e) {
420
- const s = e, { t } = E(), n = x(), m = Y(), { home: d } = Q(), u = A(), r = F(!1), a = g(() => {
421
- const c = O(n.session.state.value);
421
+ const s = e, { t } = E(), n = x(), m = Q(), { home: d } = Z(), u = C(), r = V(!1), a = y(() => {
422
+ const c = R(n.session.state.value);
422
423
  return c !== null && c.impersonator === void 0 && c.user.id !== s.userId;
423
424
  });
424
425
  async function l() {
425
426
  r.value = !0;
426
427
  try {
427
- await Ce(n, s.userId), await m.push(d);
428
+ await Re(n, s.userId), await m.push(d);
428
429
  } catch (c) {
429
430
  $(c) || k.error(u(c, { fallback: t("core.identity.impersonation.sign_in_as_failed", { name: s.name }) }));
430
431
  } finally {
431
432
  r.value = !1;
432
433
  }
433
434
  }
434
- return (c, h) => a.value ? (_(), K(o(Te), {
435
+ return (c, h) => a.value ? (_(), U(o(Ae), {
435
436
  key: 0,
436
437
  permission: s.permission
437
438
  }, {
438
439
  default: T(() => [
439
- v(o(z), {
440
+ g(o(G), {
440
441
  processing: r.value,
441
442
  "data-sign-in-as": "",
442
443
  onClick: l
443
444
  }, {
444
445
  default: T(() => [
445
- C(f(o(t)("core.identity.impersonation.sign_in_as", { name: s.name })), 1)
446
+ O(f(o(t)("core.identity.impersonation.sign_in_as", { name: s.name })), 1)
446
447
  ]),
447
448
  _: 1
448
449
  }, 8, ["processing"])
@@ -450,29 +451,51 @@ const Ds = /* @__PURE__ */ w({
450
451
  _: 1
451
452
  }, 8, ["permission"])) : I("", !0);
452
453
  }
454
+ }), [rs, Bs] = A("vue-core.serviceaccounts"), Y = "iam.serviceaccount:view", js = "iam.serviceaccount:manage", Ws = "iam.serviceaccount:revoke", H = K({
455
+ index: { name: "serviceaccounts.index", path: "/iam/service-accounts", component: () => import("./ServiceAccountsList-CcRJvNaf.js"), meta: { access: Y, titleKey: "core.serviceaccounts.title_plural" } },
456
+ record: {
457
+ name: "serviceaccounts.record",
458
+ path: "/iam/service-accounts/:id",
459
+ component: () => import("./ServiceAccountRecord-BtaUZuWU.js"),
460
+ meta: { access: Y, titleKey: "core.serviceaccounts.title_plural", remountOnParam: "id" }
461
+ }
453
462
  });
463
+ function Ys(e = {}) {
464
+ return N({
465
+ id: "serviceaccounts",
466
+ routes: H.records,
467
+ context: F(rs, { tenants: e.tenants ?? null }),
468
+ navigation: e.destination ? [{ destination: e.destination, to: H.index, within: ["serviceaccounts.record"] }] : [],
469
+ requires: ["access"]
470
+ });
471
+ }
454
472
  export {
455
- zs as M,
456
- es as P,
457
- Ds as _,
458
- Ge as a,
459
- Us as b,
460
- Ks as c,
473
+ js as M,
474
+ ts as P,
475
+ Ws as R,
476
+ Ms as _,
477
+ Fe as a,
478
+ Gs as b,
479
+ qs as c,
461
480
  $ as d,
462
- qs as e,
463
- se as f,
464
- $s as g,
465
- Rs as h,
481
+ Fs as e,
482
+ Bs as f,
483
+ ne as g,
484
+ Ds as h,
466
485
  b as i,
467
- Is as j,
468
- Qe as k,
469
- Pe as l,
470
- Je as m,
471
- ee as n,
472
- Ce as o,
473
- Ls as p,
474
- Gs as q,
475
- Oe as r,
476
- Ae as s,
477
- Q as u
486
+ zs as j,
487
+ $s as k,
488
+ Ls as l,
489
+ Ze as m,
490
+ Ce as n,
491
+ Xe as o,
492
+ Ns as p,
493
+ te as q,
494
+ Ke as r,
495
+ H as s,
496
+ Ys as t,
497
+ Z as u,
498
+ Oe as v,
499
+ Re as w,
500
+ Vs as x
478
501
  };
@@ -135,9 +135,9 @@ function Me(n = ee().http, t = W()) {
135
135
  return { state: $(e), hash: $(i), busy: $(a), inspect: c, enable: u, disable: g };
136
136
  }
137
137
  const Ne = "events.deadletter:view", $t = "events.deadletter:retry", Y = te({
138
- index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-IgVHao84.js"), meta: { access: Ne, titleKey: "core.notifications.dead_letters.title" } }
138
+ index: { name: "events.deadletters", path: "/events/dead-letters", component: () => import("./DeadLetters-CeHfhFHP.js"), meta: { access: Ne, titleKey: "core.notifications.dead_letters.title" } }
139
139
  }), j = te({
140
- index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-C0qEC0uI.js"), meta: { titleKey: "core.notifications.settings.title" } }
140
+ index: { name: "notifications.settings", path: "/profile/notifications", component: () => import("./SettingsPage-D4G1HGbG.js"), meta: { titleKey: "core.notifications.settings.title" } }
141
141
  }), Oe = /* @__PURE__ */ q({
142
142
  __name: "SettingsMenuItem",
143
143
  setup(n) {