@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
@@ -0,0 +1,137 @@
1
+ import { defineComponent as F, useTemplateRef as M, ref as w, computed as n, openBlock as c, createBlock as d, unref as t, withCtx as r, createElementVNode as p, createVNode as l, createElementBlock as _, toDisplayString as b, createCommentVNode as x, Fragment as O, renderList as j, createTextVNode as q } from "vue";
2
+ import { useI18n as z } from "vue-i18n";
3
+ import { useRouter as D } from "vue-router";
4
+ import { u as G } from "./refusals-COPr15XZ.js";
5
+ import { _ as I } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
6
+ import { _ as K } from "./Tabs.vue_vue_type_script_setup_true_lang-CcMcE38r.js";
7
+ import { _ as P } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
8
+ import { g as H } from "./options-e_CAfvDQ.js";
9
+ import { _ as J } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
10
+ import { u as Q } from "./format-D8X4zsx6.js";
11
+ import { a as W } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang-GUTIXuNd.js";
12
+ import { u as X } from "./platform-Dx6STiwY.js";
13
+ import { _ as Y } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
14
+ import { _ as Z } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
15
+ import { u as ee } from "./useLoad-W4tfxmm5.js";
16
+ import { f as te, M as $, s as A } from "./index-Cmj9iZmT.js";
17
+ import { u as ae, _ as se } from "./ServiceAccountDialog.vue_vue_type_script_setup_true_lang-DuvSSBbX.js";
18
+ const oe = {
19
+ class: "flex min-w-0 flex-col gap-group-gap",
20
+ "data-test": "service-segment"
21
+ }, ce = { class: "flex flex-wrap items-center gap-3" }, re = { "data-test": "service-accounts" }, ne = {
22
+ key: 0,
23
+ class: "px-row-inset py-6 text-center text-body text-content-muted",
24
+ "data-test": "service-accounts-empty"
25
+ }, le = {
26
+ key: 1,
27
+ class: "min-w-[4.5rem] text-right text-footnote tabular-nums text-content-muted",
28
+ "data-test": "account-keys"
29
+ }, Ve = /* @__PURE__ */ F({
30
+ __name: "ServiceAccountsList",
31
+ setup(ie) {
32
+ const { t: a } = z(), L = D(), { access: y } = X(), V = Q(), C = G(), N = ae(), { tenants: S } = te(), g = M("dialog"), v = ee(({ signal: e }) => N.list({ signal: e })), i = w("active"), f = w(""), h = n(() => v.data.value ?? []), u = (e) => e.deactivated_at === null, B = (e) => e.tenant?.name ?? C.levelLabel("organization"), m = n(() => {
33
+ const e = f.value.trim().toLowerCase();
34
+ return h.value.filter((o) => e === "" || `${o.name} ${o.description} ${o.owner.name}`.toLowerCase().includes(e));
35
+ }), k = n(() => m.value.filter((e) => i.value === "all" || i.value === "active" === u(e))), R = n(() => [
36
+ { value: "active", label: a("core.serviceaccounts.views.active"), badge: m.value.filter(u).length },
37
+ { value: "inactive", label: a("core.serviceaccounts.views.inactive"), badge: m.value.filter((e) => !u(e)).length },
38
+ { value: "all", label: a("core.serviceaccounts.views.all"), badge: m.value.length }
39
+ ]), T = n(
40
+ () => y.can($) ? [{ id: "create", label: a("core.serviceaccounts.create"), icon: "addLine", placement: "primary", compact: "icon", keyboardShortcut: { key: "N", ctrlKey: !0 }, onClick: () => g.value?.show() }] : []
41
+ );
42
+ function E(e) {
43
+ return [
44
+ e.description,
45
+ ...S ? [B(e)] : [],
46
+ e.owner.name,
47
+ e.last_used_at ? a("core.serviceaccounts.last_call", { at: V.dateTime(e.last_used_at) }) : a("core.serviceaccounts.never_used")
48
+ ].filter(Boolean).join(" · ");
49
+ }
50
+ const U = (e) => void L.push({ ...A.record({ id: e.id }), query: { tab: "access" } });
51
+ return (e, o) => (c(), d(t(W), {
52
+ title: t(a)("core.serviceaccounts.title_plural"),
53
+ description: t(a)("core.serviceaccounts.description"),
54
+ icon: "key2Line",
55
+ count: h.value.length || null,
56
+ actions: T.value
57
+ }, {
58
+ default: r(() => [
59
+ p("div", oe, [
60
+ p("div", ce, [
61
+ l(t(K), {
62
+ modelValue: i.value,
63
+ "onUpdate:modelValue": o[0] || (o[0] = (s) => i.value = s),
64
+ tabs: R.value,
65
+ presentation: "scope"
66
+ }, null, 8, ["modelValue", "tabs"]),
67
+ l(t(J), {
68
+ modelValue: f.value,
69
+ "onUpdate:modelValue": o[1] || (o[1] = (s) => f.value = s),
70
+ class: "min-w-[14rem] flex-1",
71
+ label: t(a)("core.serviceaccounts.search"),
72
+ "label-hidden": "",
73
+ placeholder: t(a)("core.serviceaccounts.search")
74
+ }, null, 8, ["modelValue", "label", "placeholder"])
75
+ ]),
76
+ l(t(Y), {
77
+ state: t(v).state.value,
78
+ "skeleton-rows": 4,
79
+ "is-empty": () => !1,
80
+ onRetry: o[2] || (o[2] = (s) => t(v).reload())
81
+ }, {
82
+ default: r(() => [
83
+ p("div", re, [
84
+ l(t(P), {
85
+ footer: t(a)("core.serviceaccounts.no_password")
86
+ }, {
87
+ default: r(() => [
88
+ k.value.length === 0 ? (c(), _("p", ne, b(t(a)("core.serviceaccounts.empty")), 1)) : x("", !0),
89
+ (c(!0), _(O, null, j(k.value, (s) => (c(), d(t(H), {
90
+ key: s.id,
91
+ layout: "setting",
92
+ label: s.name,
93
+ sub: E(s),
94
+ to: t(A).record({ id: s.id }),
95
+ "data-service-account": s.id
96
+ }, {
97
+ leading: r(() => [
98
+ l(t(I), {
99
+ tone: "anchor",
100
+ icon: "key2Line"
101
+ })
102
+ ]),
103
+ default: r(() => [
104
+ u(s) ? (c(), _("span", le, b(t(a)("core.serviceaccounts.active_keys", { count: s.active_keys })), 1)) : (c(), d(t(Z), {
105
+ key: 0,
106
+ tone: "neutral"
107
+ }, {
108
+ default: r(() => [
109
+ q(b(t(a)("core.serviceaccounts.deactivated")), 1)
110
+ ]),
111
+ _: 1
112
+ }))
113
+ ]),
114
+ _: 2
115
+ }, 1032, ["label", "sub", "to", "data-service-account"]))), 128))
116
+ ]),
117
+ _: 1
118
+ }, 8, ["footer"])
119
+ ])
120
+ ]),
121
+ _: 1
122
+ }, 8, ["state"])
123
+ ]),
124
+ t(y).can(t($)) ? (c(), d(se, {
125
+ key: 0,
126
+ ref_key: "dialog",
127
+ ref: g,
128
+ onSaved: U
129
+ }, null, 512)) : x("", !0)
130
+ ]),
131
+ _: 1
132
+ }, 8, ["title", "description", "count", "actions"]));
133
+ }
134
+ });
135
+ export {
136
+ Ve as default
137
+ };
@@ -3,8 +3,8 @@ import { useI18n as E } from "vue-i18n";
3
3
  import { _ as y } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
4
  import { _ as B } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
5
5
  import { u as N } from "./format-D8X4zsx6.js";
6
- import { _ as V } from "./FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js";
7
- import { g as h } from "./options-Bu0XbEpN.js";
6
+ import { _ as V } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
7
+ import { g as h } from "./options-e_CAfvDQ.js";
8
8
  import { _ as k } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
9
9
  const L = {
10
10
  class: "flex flex-col gap-y-0.5 md:flex-row md:flex-wrap md:items-center md:gap-x-1.5",
@@ -2,14 +2,14 @@ import { defineComponent as x, useTemplateRef as v, computed as w, ref as $, ope
2
2
  import { useI18n as N } from "vue-i18n";
3
3
  import { _ as q } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
4
  import { u as A } from "./describeError-BqGAUZgX.js";
5
- import { P as D, b as L, e as O, i as g, d as T } from "./index-Ok29ucE3.js";
5
+ import { P as D, b as L, e as O, i as g, d as T } from "./index-Cmj9iZmT.js";
6
6
  import { _ as k } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
7
7
  import { t as b } from "./toast-CqSDTWRX.js";
8
8
  import { u as V } from "./platform-Dx6STiwY.js";
9
9
  import { b as I } from "./routeResource-CcYA75T2.js";
10
10
  import { _ as j } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
11
11
  import { _ as z } from "./SectionIntro.vue_vue_type_script_setup_true_lang-CZtPrmXD.js";
12
- import { _ as F } from "./SessionList.vue_vue_type_script_setup_true_lang-PuWIK-Wa.js";
12
+ import { _ as F } from "./SessionList.vue_vue_type_script_setup_true_lang-VvBB2EZz.js";
13
13
  const G = {
14
14
  class: "flex min-w-0 flex-col gap-group-gap",
15
15
  "data-person-sessions": ""
@@ -5,26 +5,26 @@ import { a as oe } from "./AdaptivePageShell.vue_vue_type_script_setup_true_lang
5
5
  import { t as C } from "./toast-CqSDTWRX.js";
6
6
  import { u as U } from "./fieldMessages-DTXpWnBd.js";
7
7
  import { _ as W } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
8
- import { n as T, u as le, a as re } from "./index-C-oM_Mnf.js";
8
+ import { n as T, u as le, a as re } from "./index-DH0MoFqg.js";
9
9
  import { _ as H } from "./SectionIntro.vue_vue_type_script_setup_true_lang-CZtPrmXD.js";
10
10
  import { _ as j } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
11
11
  import { _ as ce } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
12
12
  import { u as ue } from "./format-D8X4zsx6.js";
13
- import { _ as R } from "./FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js";
14
- import { g as x } from "./options-Bu0XbEpN.js";
15
- import { _ as de } from "./TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js";
13
+ import { _ as R } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
14
+ import { g as x } from "./options-e_CAfvDQ.js";
15
+ import { _ as de } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
16
16
  import { _ as fe } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
17
17
  import { _ as me } from "./Menu.vue_vue_type_script_setup_true_lang-DsFOeCVe.js";
18
18
  import { _ as pe } from "./MenuButton.vue_vue_type_script_setup_true_lang-AGbN9r5q.js";
19
19
  import { _ as E } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
20
- import { _ as I } from "./ActionRow.vue_vue_type_script_setup_true_lang-Bv-APkGf.js";
20
+ import { _ as I } from "./ActionRow.vue_vue_type_script_setup_true_lang-D8NCXX4p.js";
21
21
  import { u as X } from "./platform-Dx6STiwY.js";
22
22
  import { u as Y } from "./useLoad-W4tfxmm5.js";
23
- import { _ as ee } from "./SwitchField.vue_vue_type_script_setup_true_lang-Dj5Aq8QT.js";
23
+ import { _ as ee } from "./SwitchField.vue_vue_type_script_setup_true_lang-DXZK89A3.js";
24
24
  import { _ as _e } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
25
25
  import { u as ve } from "./FormErrors.vue_vue_type_script_setup_true_lang-D7edzNTL.js";
26
- import { _ as ge } from "./FormView.vue_vue_type_script_setup_true_lang-D31Hk3pJ.js";
27
- import { _ as A } from "./TimeField.vue_vue_type_script_setup_true_lang-jPKPE1hc.js";
26
+ import { _ as ge } from "./FormView.vue_vue_type_script_setup_true_lang-nyz8EkzM.js";
27
+ import { _ as A } from "./TimeField.vue_vue_type_script_setup_true_lang-CbflIrq6.js";
28
28
  import { a as K, n as be } from "./useTypedEntry-C7k7Dyl-.js";
29
29
  const he = {
30
30
  class: "flex min-w-0 flex-col gap-group-gap",
@@ -3,15 +3,15 @@ import { useI18n as A } from "vue-i18n";
3
3
  import { _ as B } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
4
4
  import { _ as V } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
5
5
  import { u as D } from "./format-D8X4zsx6.js";
6
- import { _ as p } from "./FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js";
7
- import { g as b } from "./options-Bu0XbEpN.js";
6
+ import { _ as p } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
7
+ import { g as b } from "./options-e_CAfvDQ.js";
8
8
  import { u as U } from "./describeError-BqGAUZgX.js";
9
- import { c as q, P as z, b as F, _ as L, i as O, d as T } from "./index-Ok29ucE3.js";
9
+ import { c as q, P as z, b as F, _ as L, i as O, d as T } from "./index-Cmj9iZmT.js";
10
10
  import { t as h } from "./toast-CqSDTWRX.js";
11
11
  import { u as j, h as G } from "./platform-Dx6STiwY.js";
12
12
  import { b as H } from "./routeResource-CcYA75T2.js";
13
13
  import { _ as J } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
14
- import { _ as K } from "./ActionRow.vue_vue_type_script_setup_true_lang-Bv-APkGf.js";
14
+ import { _ as K } from "./ActionRow.vue_vue_type_script_setup_true_lang-D8NCXX4p.js";
15
15
  import { _ as M } from "./SectionIntro.vue_vue_type_script_setup_true_lang-CZtPrmXD.js";
16
16
  const Q = {
17
17
  key: 0,
@@ -3,10 +3,10 @@ import { useI18n as x } from "vue-i18n";
3
3
  import { useRoute as y, useRouter as h } from "vue-router";
4
4
  import { _ as I } from "./Button.vue_vue_type_script_setup_true_lang-CL9Qh5yq.js";
5
5
  import { _ as N } from "./Panel.vue_vue_type_script_setup_true_lang-BA0u_DtS.js";
6
- import { _ as S } from "./FormView.vue_vue_type_script_setup_true_lang-D31Hk3pJ.js";
7
- import { _ as a } from "./TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js";
6
+ import { _ as S } from "./FormView.vue_vue_type_script_setup_true_lang-nyz8EkzM.js";
7
+ import { _ as a } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
8
8
  import { r as $ } from "./guards-D4mXf_2X.js";
9
- import { u as C, a as E } from "./index-Ok29ucE3.js";
9
+ import { u as C, a as E } from "./index-Cmj9iZmT.js";
10
10
  const V = { class: "flex flex-1 flex-col items-center justify-center gap-8" }, k = { class: "text-xl font-semibold text-content-strong" }, H = /* @__PURE__ */ d({
11
11
  __name: "SignInPage",
12
12
  setup(q) {
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as y, computed as k, openBlock as _, createElementBlock as b, createVNode as r, unref as t, withCtx as l, createElementVNode as u, toDisplayString as d, createTextVNode as $, ref as v, watch as w, createBlock as I, createCommentVNode as S } from "vue";
2
2
  import { useI18n as h } from "vue-i18n";
3
- import { P as V, i as N } from "./index-Ok29ucE3.js";
3
+ import { P as V, i as N } from "./index-Cmj9iZmT.js";
4
4
  import { u as B } from "./platform-Dx6STiwY.js";
5
5
  import { b as E } from "./routeResource-CcYA75T2.js";
6
6
  import { _ as R } from "./AsyncSection.vue_vue_type_script_setup_true_lang-B0NfvG3B.js";
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as v, useModel as w, computed as y, openBlock as g, createBlock as k, mergeProps as _, unref as t, createSlots as $, withCtx as l, createElementVNode as s, renderSlot as i, normalizeClass as d, normalizeStyle as B, toDisplayString as S, mergeModels as z, mergeDefaults as C } from "vue";
2
2
  import { useI18n as M } from "vue-i18n";
3
- import { u as V, _ as D, f as T, b as E } from "./options-Bu0XbEpN.js";
3
+ import { u as V, _ as D, f as T, b as E } from "./options-e_CAfvDQ.js";
4
4
  const F = { class: "flex items-center gap-2" }, I = ["id", "aria-checked", "aria-label", "aria-describedby", "aria-invalid", "disabled"], P = { class: "sr-only" }, Z = /* @__PURE__ */ v({
5
5
  __name: "SwitchField",
6
6
  props: /* @__PURE__ */ z(/* @__PURE__ */ C({
@@ -1,10 +1,10 @@
1
1
  import { defineComponent as K, useTemplateRef as N, computed as v, watch as te, nextTick as oe, openBlock as n, createElementBlock as l, withModifiers as se, normalizeStyle as ne, unref as i, createElementVNode as m, toDisplayString as r, createCommentVNode as p, Fragment as R, renderList as ae, normalizeClass as B, createBlock as P, renderSlot as b, createTextVNode as E, useModel as ie, ref as le, mergeProps as re, createSlots as ce, withCtx as w, withDirectives as de, vModelDynamic as ue, mergeModels as H, mergeDefaults as pe } from "vue";
2
2
  import { useI18n as G } from "vue-i18n";
3
3
  import { b as me } from "./controlSurface-t7OEFESJ.js";
4
- import { a as fe, c as he, _ as ve, f as ge, b as ye } from "./options-Bu0XbEpN.js";
4
+ import { a as fe, e as he, _ as ve, f as ge, b as ye } from "./options-e_CAfvDQ.js";
5
5
  import { _ as xe } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
6
6
  import { u as be, N as ke } from "./anchored-DpuUwf-9.js";
7
- import { l as U, m as _e, u as we, c as $e } from "./suggestions-ClyLexMO.js";
7
+ import { l as U, m as _e, u as we, c as $e } from "./suggestions-cPjs5gQz.js";
8
8
  const Me = ["id", "aria-busy"], qe = { class: "min-h-0 flex-1 overflow-y-auto p-1.5" }, Be = {
9
9
  key: 0,
10
10
  class: "px-2.5 pb-1 pt-1.5 text-caption font-semibold uppercase text-content-disabled",
@@ -1,6 +1,6 @@
1
1
  import { defineComponent as V, useModel as L, useTemplateRef as M, computed as i, openBlock as p, createBlock as D, mergeProps as F, unref as f, createSlots as S, withCtx as n, createElementVNode as v, normalizeClass as b, withDirectives as z, vModelText as E, createElementBlock as P, toDisplayString as R, createCommentVNode as N, renderSlot as d, mergeModels as y, mergeDefaults as _ } from "vue";
2
2
  import { u as j } from "./mediaQuery-CygcXmFW.js";
3
- import { a as G, u as H, c as U, _ as A, f as I, b as J } from "./options-Bu0XbEpN.js";
3
+ import { a as G, u as H, e as U, _ as A, f as I, b as J } from "./options-e_CAfvDQ.js";
4
4
  const K = ["id", "name", "rows", "placeholder", "maxlength", "autocomplete", "disabled", "required", "aria-required", "aria-invalid", "aria-describedby"], O = {
5
5
  key: 0,
6
6
  class: "mt-1 self-end text-footnote tabular-nums text-content-muted"
@@ -5,7 +5,7 @@ import { u as oe } from "./format-D8X4zsx6.js";
5
5
  import { _ as le } from "./Icon.vue_vue_type_script_lang-D7oC-d-S.js";
6
6
  import { u as ae } from "./mediaQuery-CygcXmFW.js";
7
7
  import { _ as re } from "./Popover.vue_vue_type_script_setup_true_lang-C70GrCP7.js";
8
- import { c as se, _ as ie, f as ne, b as ue } from "./options-Bu0XbEpN.js";
8
+ import { e as se, _ as ie, f as ne, b as ue } from "./options-e_CAfvDQ.js";
9
9
  import { d as me, r as de, t as I, p as ce, u as pe, a as fe, i as Q, _ as ve, b as be, c as ye } from "./useTypedEntry-C7k7Dyl-.js";
10
10
  function ke(s) {
11
11
  const { t: i } = R(), y = m(() => [i("core.form.time.words.now").toLowerCase(), "now"]);
@@ -1,9 +1,9 @@
1
- import { defineComponent as R, openBlock as q, createBlock as P, unref as e, withCtx as u, createVNode as t, mergeProps as L, provide as N, computed as g, useTemplateRef as $, createElementVNode as x, toDisplayString as C, createTextVNode as j } from "vue";
1
+ import { defineComponent as R, openBlock as q, createBlock as P, unref as e, withCtx as u, createVNode as t, mergeProps as L, provide as N, computed as g, useTemplateRef as $, createElementVNode as x, toDisplayString as C, createTextVNode as O } from "vue";
2
2
  import { useI18n as A } from "vue-i18n";
3
- import { a as F } from "./neighbors-Bv6vnWlW.js";
3
+ import { a as F } from "./neighbors-DNZuGlQH.js";
4
4
  import { _ as H } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
5
5
  import { u as J } from "./describeError-BqGAUZgX.js";
6
- import { i as w, P as Q, p as W, f as X, M as Y, g as Z, d as ee } from "./index-Ok29ucE3.js";
6
+ import { i as w, P as Q, p as W, g as X, h as Y, j as Z, d as ee } from "./index-Cmj9iZmT.js";
7
7
  import { _ as se } from "./AlertDialog.vue_vue_type_script_setup_true_lang-whA4WLdl.js";
8
8
  import { t as k } from "./toast-CqSDTWRX.js";
9
9
  import { _ as ae } from "./SectionNavigator.vue_vue_type_script_setup_true_lang-Ci04hApd.js";
@@ -14,12 +14,12 @@ import { A as re } from "./access-DmAceEo5.js";
14
14
  import { _ as ne } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
15
15
  import { u as ie } from "./useLoad-W4tfxmm5.js";
16
16
  import { _ as V } from "./IconTile.vue_vue_type_script_setup_true_lang-_FXvaj93.js";
17
- import { _ as T } from "./FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js";
18
- import { g as B } from "./options-Bu0XbEpN.js";
19
- import { u as z, _ as K } from "./useCommand-DyuPTosF.js";
17
+ import { _ as z } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
18
+ import { g as B } from "./options-e_CAfvDQ.js";
19
+ import { u as K, _ as M } from "./useCommand-CfG727e8.js";
20
20
  import { u as U } from "./fieldMessages-DTXpWnBd.js";
21
- import { u as ce, s as le } from "./status-C78NpXyB.js";
22
- import { _ as M } from "./TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js";
21
+ import { u as ce, s as le } from "./status-C8XtnK6m.js";
22
+ import { _ as T } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
23
23
  const ue = /* @__PURE__ */ R({
24
24
  __name: "DeactivateDialog",
25
25
  props: {
@@ -29,7 +29,7 @@ const ue = /* @__PURE__ */ R({
29
29
  },
30
30
  emits: ["done"],
31
31
  setup(h, { expose: a, emit: d }) {
32
- const c = h, v = d, { t: s } = A(), { http: n } = E(), l = z({
32
+ const c = h, v = d, { t: s } = A(), { http: n } = E(), l = K({
33
33
  ...U(),
34
34
  defaults: () => ({}),
35
35
  run: () => n.request(w.usersDeactivate, { id: c.id }),
@@ -37,7 +37,7 @@ const ue = /* @__PURE__ */ R({
37
37
  k.success(s("core.users.deactivate.done", { name: c.name })), v("done");
38
38
  }
39
39
  });
40
- return a({ open: () => l.present() }), (f, o) => (q(), P(e(K), {
40
+ return a({ open: () => l.present() }), (f, o) => (q(), P(e(M), {
41
41
  command: e(l),
42
42
  title: e(s)("core.users.deactivate.title"),
43
43
  subtitle: c.name,
@@ -47,7 +47,7 @@ const ue = /* @__PURE__ */ R({
47
47
  size: "md"
48
48
  }, {
49
49
  default: u(() => [
50
- t(e(T), { "data-deactivate-dialog": "" }, {
50
+ t(e(z), { "data-deactivate-dialog": "" }, {
51
51
  default: u(() => [
52
52
  t(e(B), {
53
53
  layout: "setting",
@@ -98,7 +98,7 @@ const ue = /* @__PURE__ */ R({
98
98
  ];
99
99
  return b.length > 0 ? { success: !1, error: { issues: b } } : { success: !0, data: { password: m } };
100
100
  }
101
- }, f = z({
101
+ }, f = K({
102
102
  ...U(),
103
103
  defaults: () => ({ password: "", repeat: "" }),
104
104
  validator: l,
@@ -107,25 +107,25 @@ const ue = /* @__PURE__ */ R({
107
107
  k.success(s("core.users.password.done", { name: c.name })), v("saved");
108
108
  }
109
109
  });
110
- return a({ open: () => f.present() }), (o, m) => (q(), P(e(K), {
110
+ return a({ open: () => f.present() }), (o, m) => (q(), P(e(M), {
111
111
  command: e(f),
112
112
  title: e(s)("core.users.password.title"),
113
113
  subtitle: c.name,
114
114
  "confirm-label": e(s)("core.users.password.action")
115
115
  }, {
116
116
  default: u(() => [
117
- t(e(T), {
117
+ t(e(z), {
118
118
  footer: e(s)("core.users.password.footer"),
119
119
  "data-set-password-dialog": ""
120
120
  }, {
121
121
  default: u(() => [
122
- t(e(M), L(e(f).form.bind("password"), {
122
+ t(e(T), L(e(f).form.bind("password"), {
123
123
  label: e(s)("core.users.fields.password"),
124
124
  type: "password",
125
125
  required: "",
126
126
  autocomplete: "new-password"
127
127
  }), null, 16, ["label"]),
128
- t(e(M), L(e(f).form.bind("repeat"), {
128
+ t(e(T), L(e(f).form.bind("repeat"), {
129
129
  label: e(s)("core.users.fields.password_repeat"),
130
130
  type: "password",
131
131
  required: "",
@@ -141,7 +141,7 @@ const ue = /* @__PURE__ */ R({
141
141
  }), me = {
142
142
  class: "flex items-center gap-3 px-1.5",
143
143
  "data-person-identity": ""
144
- }, pe = { class: "flex min-w-0 flex-col items-start gap-0.5" }, fe = { class: "max-w-full truncate text-headline font-semibold text-content-strong" }, ve = { class: "max-w-full truncate text-footnote text-content-muted" }, Te = /* @__PURE__ */ R({
144
+ }, pe = { class: "flex min-w-0 flex-col items-start gap-0.5" }, fe = { class: "max-w-full truncate text-headline font-semibold text-content-strong" }, ve = { class: "max-w-full truncate text-footnote text-content-muted" }, ze = /* @__PURE__ */ R({
145
145
  __name: "UserRecord",
146
146
  setup(h) {
147
147
  const { t: a } = A(), { http: d, access: c, session: v } = E(), s = J(), n = te({
@@ -160,7 +160,7 @@ const ue = /* @__PURE__ */ R({
160
160
  async function y() {
161
161
  await Promise.all([n.reload(), l.reload()]);
162
162
  }
163
- async function G() {
163
+ async function j() {
164
164
  const r = n.id.value;
165
165
  if (r !== null) {
166
166
  try {
@@ -184,10 +184,10 @@ const ue = /* @__PURE__ */ R({
184
184
  setPassword: () => b.value?.open(),
185
185
  refresh: y
186
186
  });
187
- const I = g(() => [
187
+ const G = g(() => [
188
188
  ...S.value.deactivate ? [{ id: "deactivate", label: a("core.users.actions.deactivate"), icon: "lockLine", placement: "overflow", tone: "critical", onClick: () => _.value?.open() }] : [],
189
189
  ...S.value.activate ? [{ id: "activate", label: a("core.users.actions.activate"), icon: "checkCircle", placement: "overflow", onClick: () => D.value?.present() }] : []
190
- ]), O = g(() => ({
190
+ ]), I = g(() => ({
191
191
  ...l.data.value ? { "users.record.sessions": l.data.value.sessions.length } : {},
192
192
  ...o.value?.status === "locked" ? { "users.record.signin": a("core.users.status.locked") } : {}
193
193
  }));
@@ -195,7 +195,7 @@ const ue = /* @__PURE__ */ R({
195
195
  resource: e(n),
196
196
  title: o.value?.name ?? e(a)("core.users.record"),
197
197
  list: e(f).context,
198
- actions: I.value
198
+ actions: G.value
199
199
  }, {
200
200
  default: u(({ record: i }) => [
201
201
  t(e(ae), {
@@ -203,7 +203,7 @@ const ue = /* @__PURE__ */ R({
203
203
  desktop: "sidebar",
204
204
  compact: "rows",
205
205
  "back-label": i.name,
206
- counts: O.value
206
+ counts: I.value
207
207
  }, {
208
208
  summary: u(() => [
209
209
  x("div", me, [
@@ -221,7 +221,7 @@ const ue = /* @__PURE__ */ R({
221
221
  "data-person-status": ""
222
222
  }, {
223
223
  default: u(() => [
224
- j(C(e(a)(`core.users.status.${i.status}`)), 1)
224
+ O(C(e(a)(`core.users.status.${i.status}`)), 1)
225
225
  ]),
226
226
  _: 2
227
227
  }, 1032, ["tone"])
@@ -255,7 +255,7 @@ const ue = /* @__PURE__ */ R({
255
255
  title: e(a)("core.users.activate.title"),
256
256
  message: e(a)("core.users.activate.body", { name: i.name }),
257
257
  "confirm-label": e(a)("core.users.actions.activate"),
258
- action: G
258
+ action: j
259
259
  }, null, 8, ["title", "message", "confirm-label"])
260
260
  ]),
261
261
  _: 1
@@ -263,5 +263,5 @@ const ue = /* @__PURE__ */ R({
263
263
  }
264
264
  });
265
265
  export {
266
- Te as default
266
+ ze as default
267
267
  };
@@ -1,19 +1,19 @@
1
1
  import { defineComponent as U, openBlock as p, createBlock as C, unref as e, withCtx as c, createVNode as r, mergeProps as i, useTemplateRef as V, computed as q, createTextVNode as z, toDisplayString as $, createCommentVNode as A, createElementBlock as S, normalizeClass as N } from "vue";
2
2
  import { useI18n as B } from "vue-i18n";
3
- import { useRouter as M } from "vue-router";
4
- import { u as P, _ as D } from "./CollectionPage.vue_vue_type_script_setup_true_lang-o_Pj-JcD.js";
5
- import { _ as I } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
3
+ import { useRouter as P } from "vue-router";
4
+ import { u as D, _ as I } from "./CollectionPage.vue_vue_type_script_setup_true_lang-DPcCnrjr.js";
5
+ import { _ as M } from "./Avatar.vue_vue_type_script_setup_true_lang-BPj_fkJR.js";
6
6
  import { u as F } from "./format-D8X4zsx6.js";
7
7
  import { u as L } from "./platform-Dx6STiwY.js";
8
8
  import { _ as G } from "./Badge.vue_vue_type_script_setup_true_lang-DJyZc0C7.js";
9
- import { i as K, f as E, M as W } from "./index-Ok29ucE3.js";
10
- import { U as j, u as H, s as J } from "./status-C78NpXyB.js";
9
+ import { i as K, g as E, h as W } from "./index-Cmj9iZmT.js";
10
+ import { U as j, u as H, s as J } from "./status-C8XtnK6m.js";
11
11
  import { u as O } from "./environment-Dva-SG8D.js";
12
12
  import { u as Q } from "./languages-BShG9LpE.js";
13
- import { _ as X } from "./FormGroup.vue_vue_type_script_setup_true_lang-CSgT4ITL.js";
14
- import { _ as Y } from "./SelectField.vue_vue_type_script_setup_true_lang-BN4vzvV9.js";
15
- import { _ as d } from "./TextField.vue_vue_type_script_setup_true_lang-BwfNNQEz.js";
16
- import { u as Z, _ as ee } from "./useCommand-DyuPTosF.js";
13
+ import { _ as X } from "./FormGroup.vue_vue_type_script_setup_true_lang-CNb2CK01.js";
14
+ import { _ as Y } from "./SelectField.vue_vue_type_script_setup_true_lang-CBZhGNpm.js";
15
+ import { _ as d } from "./TextField.vue_vue_type_script_setup_true_lang-CX3LdZLK.js";
16
+ import { u as Z, _ as ee } from "./useCommand-CfG727e8.js";
17
17
  import { t as se } from "./toast-CqSDTWRX.js";
18
18
  import { u as te } from "./fieldMessages-DTXpWnBd.js";
19
19
  const oe = /* @__PURE__ */ U({
@@ -93,15 +93,15 @@ const oe = /* @__PURE__ */ U({
93
93
  }), ae = ["datetime"], xe = /* @__PURE__ */ U({
94
94
  __name: "UsersList",
95
95
  setup(T) {
96
- const { t: o } = B(), { http: b, access: t } = L(), g = F(), h = M(), f = V("dialog"), w = q(() => [
96
+ const { t: o } = B(), { http: b, access: t } = L(), g = F(), h = P(), f = V("dialog"), w = q(() => [
97
97
  { key: "name", label: o("core.users.columns.person"), kind: "identity", subtitle: (l) => l.email, sort: "name", mobile: "primary" },
98
98
  { key: "login", label: o("core.users.columns.login"), sort: "login", hideBelow: "md", width: 180, mobile: "hidden" },
99
99
  { key: "last_sign_in", label: o("core.users.columns.last_sign_in"), width: 170, mobile: "meta" },
100
100
  { key: "status", label: o("core.users.columns.status"), width: 130, mobile: "accessory" }
101
- ]), y = q(() => j.map((l) => ({ key: l, label: o(`core.users.views.${l}`) }))), m = P(H(b), { columns: w, views: y, state: { kind: "url", key: "query" }, recordRoute: (l) => E.record({ id: l.id }) }), k = q(
101
+ ]), y = q(() => j.map((l) => ({ key: l, label: o(`core.users.views.${l}`) }))), m = D(H(b), { columns: w, views: y, state: { kind: "url", key: "query" }, recordRoute: (l) => E.record({ id: l.id }) }), k = q(
102
102
  () => t.can(W) ? [{ id: "create", label: o("core.users.create.title"), icon: "addLine", placement: "primary", compact: "icon", keyboardShortcut: { key: "N", ctrlKey: !0 }, onClick: () => f.value?.create() }] : []
103
103
  );
104
- return (l, a) => (p(), C(e(D), {
104
+ return (l, a) => (p(), C(e(I), {
105
105
  collection: e(m),
106
106
  title: e(o)("core.users.title"),
107
107
  description: e(o)("core.users.description"),
@@ -111,7 +111,7 @@ const oe = /* @__PURE__ */ U({
111
111
  "views-presentation": "scope"
112
112
  }, {
113
113
  leading: c(({ item: s }) => [
114
- r(e(I), {
114
+ r(e(M), {
115
115
  name: s.name,
116
116
  size: "md",
117
117
  tone: "anchor"
@@ -1,12 +1,11 @@
1
1
  import type { HttpClient } from "../client";
2
2
  import type { BindInput, CreateRoleInput, UpdateRoleInput } from "../modules/access/schemas";
3
- import type { Binding, ScopeOptions, SubjectAccess, SubjectRef } from "../modules/access/entities";
4
- import type { AccessSubjects } from "./context";
3
+ import type { SubjectRef } from "../modules/access/entities";
5
4
  type Options = {
6
5
  readonly signal?: AbortSignal;
7
6
  };
8
- /** go-core's access routes as calls; `data` of each answer already read. A subject of another kind than `user` goes to `subjects[kind]`. */
9
- export declare function createAccessApi(http: HttpClient, subjects?: AccessSubjects): {
7
+ /** go-core's access routes as calls; `data` of each answer already read. A subject of kind `service` goes to the service accounts' routes. */
8
+ export declare function createAccessApi(http: HttpClient): {
10
9
  roles: (options?: Options) => Promise<import(".").RoleSummary[]>;
11
10
  role: (ref: string, options?: Options) => Promise<import(".").Role>;
12
11
  holders: (ref: string, options?: Options) => Promise<import(".").RoleHolder[]>;
@@ -15,10 +14,10 @@ export declare function createAccessApi(http: HttpClient, subjects?: AccessSubje
15
14
  update: (input: UpdateRoleInput) => Promise<import(".").Role>;
16
15
  remove: (ref: string) => Promise<undefined>;
17
16
  replace: (ref: string, other: string) => Promise<number>;
18
- access: (subject: SubjectRef, options?: Options) => Promise<SubjectAccess>;
19
- scopes: (subject: SubjectRef, options?: Options) => Promise<ScopeOptions>;
20
- bindable: (subject: SubjectRef, level: string, scopeId: number | null, options?: Options) => Promise<import(".").Role[]>;
21
- bind: (subject: SubjectRef, input: Omit<BindInput, "id">) => Promise<Binding>;
17
+ access: (subject: SubjectRef, options?: Options) => Promise<import("../modules/serviceaccount/entities").SubjectAccess>;
18
+ scopes: (subject: SubjectRef, options?: Options) => Promise<import("../modules/serviceaccount/entities").ScopeOptions>;
19
+ bindable: (subject: SubjectRef, level: string, scopeId: number | null, options?: Options) => Promise<import("../modules/serviceaccount/entities").Role[]>;
20
+ bind: (subject: SubjectRef, input: Omit<BindInput, "id">) => Promise<import("../modules/serviceaccount/entities").Binding>;
22
21
  unbind: (subject: SubjectRef, bindingId: number) => Promise<undefined>;
23
22
  };
24
23
  export type AccessApi = ReturnType<typeof createAccessApi>;
@@ -2,12 +2,6 @@ import type { RouteLocationRaw } from "vue-router";
2
2
  import type { ScopeOptions, SubjectRef } from "../modules/access/entities";
3
3
  import type { PermissionCatalogue } from "./catalogue";
4
4
  import type { RoleConstraint } from "./constraints";
5
- /** Where an application serves the access routes of a subject kind other than `user`: `${base}/:id/{access,scopes,bindings,bindings/:binding_id}`, and the roles it may be given. */
6
- export interface SubjectRoutes {
7
- readonly base: string;
8
- readonly bindable: string;
9
- }
10
- export type AccessSubjects = Readonly<Partial<Record<Exclude<SubjectRef["kind"], "user">, SubjectRoutes>>>;
11
5
  /** What the access screens need from the feature that installed them. */
12
6
  export interface AccessContext {
13
7
  readonly catalogue: PermissionCatalogue;
@@ -18,7 +12,6 @@ export interface AccessContext {
18
12
  readonly constraints: readonly RoleConstraint[];
19
13
  /** The i18n key of the sentence for each of the application's own role-problem codes (`authz.invalid`). */
20
14
  readonly problems: Readonly<Record<string, string>>;
21
- readonly subjects: AccessSubjects;
22
15
  readonly scopes: ((subject: SubjectRef, signal: AbortSignal) => Promise<ScopeOptions>) | null;
23
16
  }
24
17
  export declare const accessContextKey: import("vue").InjectionKey<AccessContext>, useAccessContext: () => AccessContext;
@@ -29,4 +22,6 @@ export declare const accessPermissions: {
29
22
  readonly deleteRoles: "iam.role:delete";
30
23
  readonly viewAccess: "iam.user:view";
31
24
  readonly manageBindings: "iam.user:manage";
25
+ /** The same for the roles of a service account (`kind: "service"`). */
26
+ readonly manageServiceBindings: "iam.serviceaccount:manage";
32
27
  };
@@ -4,7 +4,6 @@ import type { ScopeOptions, SubjectRef } from "../modules/access/entities";
4
4
  import type { Destination } from "../router";
5
5
  import type { PermissionCatalogue } from "./catalogue";
6
6
  import type { RoleConstraint } from "./constraints";
7
- import { type AccessSubjects } from "./context";
8
7
  export interface AccessFeatureOptions {
9
8
  /**
10
9
  * The application's permissions: the `permissions` object go-core's `authzts` writes (`frontend/generated/permissions.ts`).
@@ -31,13 +30,6 @@ export interface AccessFeatureOptions {
31
30
  * accessFeature({ catalogue, problems: { vehicle_kind_conflict: "roles.problems.vehicle_kind_conflict" } })
32
31
  */
33
32
  problems?: Readonly<Record<string, string>>;
34
- /**
35
- * Where the routes of a subject kind other than `user` are (go-core leaves them to the application); the paths answer in go-core's own wire.
36
- * `PersonAccess` and the add dialog with such a subject read and write there. Without an entry the subject is refused, never sent to the user routes.
37
- *
38
- * accessFeature({ catalogue, subjects: { service: { base: "/v1/iam/service-accounts", bindable: "/v1/iam/service-accounts/bindable-roles" } } })
39
- */
40
- subjects?: AccessSubjects;
41
33
  /** The backend's navigation destination that opens the roles list. Without it the application links to `accessPages.roles` itself. */
42
34
  destination?: Destination;
43
35
  }