@burdenoff/microfe-admin 2026.625.1 → 2026.712.1

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 (77) hide show
  1. package/dist/admin/AdminRoot.js +2 -2
  2. package/dist/admin/AdminRoot.js.map +1 -1
  3. package/dist/admin/AdminRoutes.js +130 -78
  4. package/dist/admin/AdminRoutes.js.map +1 -1
  5. package/dist/admin/components/AccessDenied.js +2 -2
  6. package/dist/admin/components/AccessDenied.js.map +1 -1
  7. package/dist/admin/components/ActivityFeed.js +4 -4
  8. package/dist/admin/components/ActivityFeed.js.map +1 -1
  9. package/dist/admin/components/Charts.js.map +1 -1
  10. package/dist/admin/components/ConfirmDialog.js +1 -1
  11. package/dist/admin/components/ConfirmDialog.js.map +1 -1
  12. package/dist/admin/components/DataTable.js.map +1 -1
  13. package/dist/admin/components/FormSheet.js +1 -1
  14. package/dist/admin/components/FormSheet.js.map +1 -1
  15. package/dist/admin/components/TenantSsoPanel.js +1 -1
  16. package/dist/admin/components/TenantSsoPanel.js.map +1 -1
  17. package/dist/admin/components/Toast.js +11 -11
  18. package/dist/admin/components/Toast.js.map +1 -1
  19. package/dist/admin/components/forms/SubscriptionForm.js +2 -2
  20. package/dist/admin/components/forms/SubscriptionForm.js.map +1 -1
  21. package/dist/admin/components/forms/TenantForm.js +1 -1
  22. package/dist/admin/components/forms/UserForm.js +1 -1
  23. package/dist/admin/components/ui.js +3 -3
  24. package/dist/admin/components/ui.js.map +1 -1
  25. package/dist/admin/constants/featureFlags.js +12 -0
  26. package/dist/admin/constants/featureFlags.js.map +1 -0
  27. package/dist/admin/constants/index.js +33 -24
  28. package/dist/admin/constants/index.js.map +1 -1
  29. package/dist/admin/pages/AuditLogsPage.js +92 -77
  30. package/dist/admin/pages/AuditLogsPage.js.map +1 -1
  31. package/dist/admin/pages/BillingPage.js +95 -51
  32. package/dist/admin/pages/BillingPage.js.map +1 -1
  33. package/dist/admin/pages/CommunicationsPage.js +97 -92
  34. package/dist/admin/pages/CommunicationsPage.js.map +1 -1
  35. package/dist/admin/pages/ContentPagesPage.js +274 -259
  36. package/dist/admin/pages/ContentPagesPage.js.map +1 -1
  37. package/dist/admin/pages/DashboardPage.js +113 -84
  38. package/dist/admin/pages/DashboardPage.js.map +1 -1
  39. package/dist/admin/pages/FeatureFlagsPage.js +93 -75
  40. package/dist/admin/pages/FeatureFlagsPage.js.map +1 -1
  41. package/dist/admin/pages/OrganizationsListPage.js +105 -87
  42. package/dist/admin/pages/OrganizationsListPage.js.map +1 -1
  43. package/dist/admin/pages/ProductsPage.js +138 -130
  44. package/dist/admin/pages/ProductsPage.js.map +1 -1
  45. package/dist/admin/pages/ReferralsPage.js +70 -52
  46. package/dist/admin/pages/ReferralsPage.js.map +1 -1
  47. package/dist/admin/pages/RolesPermissionsPage.js +136 -118
  48. package/dist/admin/pages/RolesPermissionsPage.js.map +1 -1
  49. package/dist/admin/pages/SREPage.js +34 -32
  50. package/dist/admin/pages/SREPage.js.map +1 -1
  51. package/dist/admin/pages/SandboxSettingsPage.js +360 -322
  52. package/dist/admin/pages/SandboxSettingsPage.js.map +1 -1
  53. package/dist/admin/pages/SettingsPage.js +64 -61
  54. package/dist/admin/pages/SettingsPage.js.map +1 -1
  55. package/dist/admin/pages/SyncFailuresPage.js +120 -118
  56. package/dist/admin/pages/SyncFailuresPage.js.map +1 -1
  57. package/dist/admin/pages/TenantDetailPage.js +286 -231
  58. package/dist/admin/pages/TenantDetailPage.js.map +1 -1
  59. package/dist/admin/pages/TenantFormRoutePage.js +78 -73
  60. package/dist/admin/pages/TenantFormRoutePage.js.map +1 -1
  61. package/dist/admin/pages/TenantsListPage.js +182 -155
  62. package/dist/admin/pages/TenantsListPage.js.map +1 -1
  63. package/dist/admin/pages/UsersListPage.js +128 -113
  64. package/dist/admin/pages/UsersListPage.js.map +1 -1
  65. package/dist/admin/pages/WaitlistPage.js +78 -63
  66. package/dist/admin/pages/WaitlistPage.js.map +1 -1
  67. package/dist/admin/pages/WorkflowsPage.js +107 -102
  68. package/dist/admin/pages/WorkflowsPage.js.map +1 -1
  69. package/dist/admin/pages/WorkspacesListPage.js +61 -49
  70. package/dist/admin/pages/WorkspacesListPage.js.map +1 -1
  71. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +2 -2
  72. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -1
  73. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +35 -26
  74. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -1
  75. package/dist/node_modules/react-hook-form/dist/index.esm.js +609 -516
  76. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -1
  77. package/package.json +2 -2
@@ -1,91 +1,93 @@
1
1
  import { useToast as e } from "../components/Toast.js";
2
2
  import { useAdmin as t } from "../providers/AdminProvider.js";
3
3
  import { useAdminPermissions as n } from "../hooks/useAdminPermissions.js";
4
- import { Avatar as r, Button as i, EmptyState as a, Input as ee } from "../components/ui.js";
5
- import { PageLayout as te } from "../components/PageLayout.js";
4
+ import { Avatar as r, Button as i, EmptyState as ee, Input as te } from "../components/ui.js";
5
+ import { PageLayout as a } from "../components/PageLayout.js";
6
6
  import { TenantStatusBadge as ne } from "../components/StatusBadge.js";
7
- import { formatBytes as re, formatDate as o, formatNumber as s } from "../utils/formatters.js";
8
- import { DataTable as c, Pagination as l } from "../components/DataTable.js";
9
- import { tWithFallback as ie } from "../utils/i18n.js";
10
- import { TenantForm as ae } from "../components/forms/TenantForm.js";
11
- import { RowActions as oe, createRowActions as se } from "../components/RowActions.js";
12
- import { PermissionGuard as ce } from "../components/PermissionGuard.js";
7
+ import { formatBytes as re, formatDate as ie, formatNumber as o } from "../utils/formatters.js";
8
+ import { DataTable as ae, Pagination as oe } from "../components/DataTable.js";
9
+ import { tWithFallback as s } from "../utils/i18n.js";
10
+ import { TenantForm as se } from "../components/forms/TenantForm.js";
11
+ import { RowActions as ce, createRowActions as le } from "../components/RowActions.js";
12
+ import { PermissionGuard as c } from "../components/PermissionGuard.js";
13
13
  import "../components/index.js";
14
- import { joinPath as u } from "../utils/navigation.js";
15
- import { mapTenantToUi as d } from "../utils/mappers.js";
16
- import { useActivateTenantMutation as f, useCreateTenantMutation as p, useListTenantsQuery as le, useSuspendTenantMutation as ue, useUpdateTenantMutation as de } from "../../generated/global-operations.js";
17
- import { useAdminStore as m } from "../store/adminStore.js";
18
- import { emitTenantLifecycle as h } from "../utils/tenantEvents.js";
19
- import { useCallback as g, useMemo as _, useState as v } from "react";
20
- import { Building2 as y, Plus as fe, Search as pe } from "lucide-react";
21
- import { useNavigate as me } from "react-router-dom";
22
- import { jsx as b, jsxs as x } from "react/jsx-runtime";
23
- import { useFeatureFlag as S } from "@burdenoff/fe-libs/shared/feature-flags";
24
- import { useI18n as he } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
25
- import { useEventBus as ge } from "@burdenoff/fe-libs/shared/events";
14
+ import { joinPath as l } from "../utils/navigation.js";
15
+ import { mapTenantToUi as u } from "../utils/mappers.js";
16
+ import { useActivateTenantMutation as ue, useCreateTenantMutation as de, useListTenantsQuery as fe, useSuspendTenantMutation as pe, useUpdateTenantMutation as me } from "../../generated/global-operations.js";
17
+ import { useAdminStore as he } from "../store/adminStore.js";
18
+ import { emitTenantLifecycle as d } from "../utils/tenantEvents.js";
19
+ import { TENANT_FEATURE_FLAGS as f } from "../constants/featureFlags.js";
20
+ import { useCallback as p, useMemo as m, useState as h } from "react";
21
+ import { Building2 as g, Plus as ge, Search as _ } from "lucide-react";
22
+ import { useNavigate as v } from "react-router-dom";
23
+ import { jsx as y, jsxs as b } from "react/jsx-runtime";
24
+ import { useFeatureFlag as x } from "@burdenoff/fe-libs/shared/feature-flags";
25
+ import { useI18n as _e } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
26
+ import { EmphasisPanel as ve, PagePurpose as ye } from "@burdenoff/fe-libs/ui";
27
+ import { useEventBus as be } from "@burdenoff/fe-libs/shared/events";
26
28
  //#region src/admin/pages/TenantsListPage.tsx
27
- var C = 20;
28
- function w() {
29
- let { canViewTenants: w, canManageTenants: T, isLoading: E } = n(), D = me(), { basePath: O = "" } = t(), { tenantFilter: k, updateTenantFilter: A, resetTenantFilter: j } = m(), M = e(), { t: N } = he(), P = S("admin.tenant.create", !0), F = S("admin.tenant.edit", !0), I = ge(), L = g((e, t, n) => ie(N, e, t, n), [N]), [R, z] = v(1), [B, V] = v(!1), [_e, H] = v(void 0), ve = _(() => {
29
+ var S = 20;
30
+ function C() {
31
+ let { canViewTenants: C, canManageTenants: w, isLoading: T } = n(), E = v(), { basePath: D = "" } = t(), { tenantFilter: O, updateTenantFilter: k, resetTenantFilter: A } = he(), j = e(), { t: M } = _e(), N = x(f.management, !0), xe = x(f.list, !0), Se = x(f.create, !0), P = x(f.edit, !0), F = be(), I = p((e, t, n) => s(M, e, t, n), [M]), [L, R] = h(1), [Ce, z] = h(!1), [we, B] = h(void 0), Te = m(() => {
30
32
  let e = {};
31
- k.search && (e.search = k.search);
33
+ O.search && (e.search = O.search);
32
34
  let t = {
33
35
  active: "ACTIVE",
34
36
  suspended: "SUSPENDED",
35
37
  deleted: "DELETED"
36
38
  };
37
- return k.status !== "all" && t[k.status] && (e.status = t[k.status]), e;
38
- }, [k.search, k.status]), ye = E || !w, { data: U, loading: be, error: W, refetch: G } = le({
39
+ return O.status !== "all" && t[O.status] && (e.status = t[O.status]), e;
40
+ }, [O.search, O.status]), V = N && xe, H = w && N, Ee = T || !C || !V, { data: U, loading: De, error: W, refetch: G } = fe({
39
41
  variables: {
40
- filter: ve,
41
- limit: C,
42
- offset: (R - 1) * C
42
+ filter: Te,
43
+ limit: S,
44
+ offset: (L - 1) * S
43
45
  },
44
46
  fetchPolicy: "cache-and-network",
45
- skip: ye
46
- }), [K, { loading: xe }] = p({ onCompleted: () => {
47
+ skip: Ee
48
+ }), [K, { loading: Oe }] = de({ onCompleted: () => {
47
49
  G();
48
- } }), [q, { loading: Se }] = de({ onCompleted: () => {
50
+ } }), [q, { loading: ke }] = me({ onCompleted: () => {
49
51
  G();
50
- } }), [J] = ue({ onCompleted: () => {
52
+ } }), [J] = pe({ onCompleted: () => {
51
53
  G();
52
- } }), [Y] = f({ onCompleted: () => {
54
+ } }), [Y] = ue({ onCompleted: () => {
53
55
  G();
54
- } }), Ce = _(() => (U?.tenants?.items ?? []).map(d), [U]), X = U?.tenants?.total ?? 0, we = Math.ceil(X / C), Te = g(() => {
55
- H(void 0), V(!0);
56
- }, []), Z = g((e) => {
57
- H(e), V(!0);
58
- }, []), Q = g(async (e) => {
56
+ } }), Ae = m(() => (U?.tenants?.items ?? []).map(u), [U]), X = U?.tenants?.total ?? 0, je = Math.ceil(X / S), Me = p(() => {
57
+ B(void 0), z(!0);
58
+ }, []), Z = p((e) => {
59
+ B(e), z(!0);
60
+ }, []), Q = p(async (e) => {
59
61
  try {
60
- await J({ variables: { id: e.id } }), h(I, "tenant.tenant.suspended", {
62
+ await J({ variables: { id: e.id } }), d(F, "tenant.tenant.suspended", {
61
63
  tenantId: e.id,
62
64
  tenantSlug: e.slug,
63
65
  status: "SUSPENDED"
64
- }), M.success(L("admin.tenants.toast.suspendedTitle", "Tenant suspended"), L("admin.tenants.toast.suspendedDescription", "{{name}} has been suspended.", { name: e.name }));
66
+ }), j.success(I("admin.tenants.toast.suspendedTitle", "Tenant suspended"), I("admin.tenants.toast.suspendedDescription", "{{name}} has been suspended.", { name: e.name }));
65
67
  } catch {
66
- M.error(L("admin.tenants.toast.errorTitle", "Error"), L("admin.tenants.toast.suspendFailed", "Failed to suspend tenant."));
68
+ j.error(I("admin.tenants.toast.errorTitle", "Error"), I("admin.tenants.toast.suspendFailed", "Failed to suspend tenant."));
67
69
  }
68
70
  }, [
69
71
  J,
70
- M,
71
- L,
72
- I
73
- ]), $ = g(async (e) => {
72
+ j,
73
+ I,
74
+ F
75
+ ]), $ = p(async (e) => {
74
76
  try {
75
- await Y({ variables: { id: e.id } }), h(I, "tenant.tenant.activated", {
77
+ await Y({ variables: { id: e.id } }), d(F, "tenant.tenant.activated", {
76
78
  tenantId: e.id,
77
79
  tenantSlug: e.slug,
78
80
  status: "ACTIVE"
79
- }), M.success(L("admin.tenants.toast.activatedTitle", "Tenant activated"), L("admin.tenants.toast.activatedDescription", "{{name}} has been activated.", { name: e.name }));
81
+ }), j.success(I("admin.tenants.toast.activatedTitle", "Tenant activated"), I("admin.tenants.toast.activatedDescription", "{{name}} has been activated.", { name: e.name }));
80
82
  } catch {
81
- M.error(L("admin.tenants.toast.errorTitle", "Error"), L("admin.tenants.toast.activateFailed", "Failed to activate tenant."));
83
+ j.error(I("admin.tenants.toast.errorTitle", "Error"), I("admin.tenants.toast.activateFailed", "Failed to activate tenant."));
82
84
  }
83
85
  }, [
84
86
  Y,
85
- M,
86
- L,
87
- I
88
- ]), Ee = g(async (e) => {
87
+ j,
88
+ I,
89
+ F
90
+ ]), Ne = p(async (e) => {
89
91
  let t = "id" in e && e.id;
90
92
  try {
91
93
  if (t) {
@@ -101,10 +103,10 @@ function w() {
101
103
  }
102
104
  }
103
105
  } }), n = t.data?.updateTenant?.id ?? e.id, r = t.data?.updateTenant?.slug;
104
- h(I, "tenant.tenant.updated", {
106
+ d(F, "tenant.tenant.updated", {
105
107
  tenantId: n,
106
108
  tenantSlug: r
107
- }), M.success(L("admin.tenants.toast.updatedTitle", "Tenant updated"), L("admin.tenants.toast.updatedDescription", "{{name}} has been updated.", { name: e.name ?? "" }));
109
+ }), j.success(I("admin.tenants.toast.updatedTitle", "Tenant updated"), I("admin.tenants.toast.updatedDescription", "{{name}} has been updated.", { name: e.name ?? "" }));
108
110
  } else {
109
111
  let t = (await K({ variables: { input: {
110
112
  name: e.name,
@@ -116,60 +118,61 @@ function w() {
116
118
  plan: e.plan
117
119
  }
118
120
  } } })).data?.createTenant;
119
- t?.id && h(I, "tenant.tenant.created", {
121
+ t?.id && d(F, "tenant.tenant.created", {
120
122
  tenantId: t.id,
121
123
  tenantSlug: t.slug
122
- }), M.success(L("admin.tenants.toast.createdTitle", "Tenant created"), L("admin.tenants.toast.createdDescription", "{{name}} has been created.", { name: e.name ?? "" }));
124
+ }), j.success(I("admin.tenants.toast.createdTitle", "Tenant created"), I("admin.tenants.toast.createdDescription", "{{name}} has been created.", { name: e.name ?? "" }));
123
125
  }
124
- V(!1);
126
+ z(!1);
125
127
  } catch (e) {
126
128
  let n = e instanceof Error ? e.message : "Unknown error";
127
- throw M.error(t ? L("admin.tenants.toast.updateFailedTitle", "Update failed") : L("admin.tenants.toast.createFailedTitle", "Create failed"), n), e;
129
+ throw j.error(t ? I("admin.tenants.toast.updateFailedTitle", "Update failed") : I("admin.tenants.toast.createFailedTitle", "Create failed"), n), e;
128
130
  }
129
131
  }, [
130
132
  K,
131
133
  q,
132
- M,
133
- L,
134
- I
135
- ]), De = (e) => {
136
- D(u(O, `tenants/${e.id}`));
137
- }, Oe = g((e) => {
138
- let t = se({
139
- onView: () => D(u(O, `tenants/${e.id}`)),
140
- onEdit: T && F ? () => Z(e) : void 0
134
+ j,
135
+ I,
136
+ F
137
+ ]), Pe = (e) => {
138
+ E(l(D, `tenants/${e.id}`));
139
+ }, Fe = p((e) => {
140
+ let t = le({
141
+ onView: () => E(l(D, `tenants/${e.id}`)),
142
+ onEdit: w && P ? () => Z(e) : void 0
141
143
  });
142
- return T && t.push({
144
+ return H && t.push({
143
145
  key: e.status === "active" ? "suspend" : "activate",
144
- label: e.status === "active" ? L("admin.tenants.actions.suspend", "Suspend") : L("admin.tenants.actions.activate", "Activate"),
146
+ label: e.status === "active" ? I("admin.tenants.actions.suspend", "Suspend") : I("admin.tenants.actions.activate", "Activate"),
145
147
  separator: !0,
146
148
  onClick: e.status === "active" ? () => Q(e) : () => $(e)
147
149
  }), t;
148
150
  }, [
151
+ E,
149
152
  D,
150
- O,
151
- T,
152
- F,
153
+ w,
154
+ H,
155
+ P,
153
156
  Z,
154
157
  Q,
155
158
  $,
156
- L
157
- ]), ke = [
159
+ I
160
+ ]), Ie = [
158
161
  {
159
162
  key: "name",
160
- header: L("admin.tenants.table.tenant", "Tenant"),
163
+ header: I("admin.tenants.table.tenant", "Tenant"),
161
164
  sortable: !0,
162
- render: (e) => /* @__PURE__ */ x("div", {
165
+ render: (e) => /* @__PURE__ */ b("div", {
163
166
  className: "flex items-center gap-3",
164
- children: [/* @__PURE__ */ b(r, {
167
+ children: [/* @__PURE__ */ y(r, {
165
168
  fallback: e.name.slice(0, 2).toUpperCase(),
166
169
  size: "sm"
167
- }), /* @__PURE__ */ x("div", {
170
+ }), /* @__PURE__ */ b("div", {
168
171
  className: "min-w-0",
169
- children: [/* @__PURE__ */ b("div", {
172
+ children: [/* @__PURE__ */ y("div", {
170
173
  className: "truncate font-medium text-text-primary",
171
174
  children: e.name
172
- }), /* @__PURE__ */ b("div", {
175
+ }), /* @__PURE__ */ y("div", {
173
176
  className: "truncate text-xs text-text-secondary",
174
177
  children: e.slug
175
178
  })]
@@ -178,164 +181,188 @@ function w() {
178
181
  },
179
182
  {
180
183
  key: "status",
181
- header: L("admin.tenants.table.status", "Status"),
184
+ header: I("admin.tenants.table.status", "Status"),
182
185
  width: "120px",
183
- render: (e) => /* @__PURE__ */ b(ne, { status: e.status })
186
+ render: (e) => /* @__PURE__ */ y(ne, { status: e.status })
184
187
  },
185
188
  {
186
189
  key: "plan",
187
- header: L("admin.tenants.table.plan", "Plan"),
190
+ header: I("admin.tenants.table.plan", "Plan"),
188
191
  width: "100px"
189
192
  },
190
193
  {
191
194
  key: "userCount",
192
- header: L("admin.tenants.table.users", "Users"),
195
+ header: I("admin.tenants.table.users", "Users"),
193
196
  width: "80px",
194
197
  align: "right",
195
198
  sortable: !0,
196
- render: (e) => s(e.userCount)
199
+ render: (e) => o(e.userCount)
197
200
  },
198
201
  {
199
202
  key: "storageUsed",
200
- header: L("admin.tenants.table.storage", "Storage"),
203
+ header: I("admin.tenants.table.storage", "Storage"),
201
204
  width: "100px",
202
205
  align: "right",
203
206
  render: (e) => re(e.storageUsed)
204
207
  },
205
208
  {
206
209
  key: "createdAt",
207
- header: L("admin.tenants.table.created", "Created"),
210
+ header: I("admin.tenants.table.created", "Created"),
208
211
  width: "120px",
209
212
  sortable: !0,
210
- render: (e) => o(e.createdAt)
213
+ render: (e) => ie(e.createdAt)
211
214
  },
212
215
  {
213
216
  key: "actions",
214
217
  header: "",
215
218
  width: "50px",
216
219
  align: "right",
217
- render: (e) => /* @__PURE__ */ b(oe, {
218
- actions: Oe(e),
219
- ariaLabel: L("admin.tenants.table.actionsFor", "Actions for {{name}}", { name: e.name })
220
+ render: (e) => /* @__PURE__ */ y(ce, {
221
+ actions: Fe(e),
222
+ ariaLabel: I("admin.tenants.table.actionsFor", "Actions for {{name}}", { name: e.name })
220
223
  })
221
224
  }
222
225
  ];
223
- return /* @__PURE__ */ b(ce, {
224
- allowed: w,
225
- isLoading: E,
226
- pageTitle: L("admin.tenants.title", "Tenants"),
227
- denyMessage: L("admin.tenants.denyMessage", "You don't have permission to view tenants."),
228
- children: /* @__PURE__ */ x(te, {
229
- title: L("admin.tenants.title", "Tenants"),
230
- gradientWord: L("admin.tenants.title", "Tenants"),
231
- description: X ? L("admin.tenants.descriptionWithTotal", "Manage all tenants on the platform · {{total}} total", { total: X }) : L("admin.tenants.description", "Manage all tenants on the platform"),
232
- actions: T && P ? /* @__PURE__ */ x(i, {
233
- onClick: Te,
234
- disabled: xe || Se,
235
- children: [/* @__PURE__ */ b(fe, { className: "mr-2 h-4 w-4" }), L("admin.tenants.actions.createTenant", "Create Tenant")]
226
+ return !T && !C ? /* @__PURE__ */ y(c, {
227
+ allowed: !1,
228
+ isLoading: !1,
229
+ pageTitle: I("admin.tenants.title", "Tenants"),
230
+ denyMessage: I("admin.tenants.denyMessage", "You don't have permission to view tenants."),
231
+ children: null
232
+ }) : V ? /* @__PURE__ */ y(c, {
233
+ allowed: C,
234
+ isLoading: T,
235
+ pageTitle: I("admin.tenants.title", "Tenants"),
236
+ denyMessage: I("admin.tenants.denyMessage", "You don't have permission to view tenants."),
237
+ children: /* @__PURE__ */ b(a, {
238
+ title: I("admin.tenants.title", "Tenants"),
239
+ gradientWord: I("admin.tenants.title", "Tenants"),
240
+ description: X ? I("admin.tenants.descriptionWithTotal", "Manage all tenants on the platform · {{total}} total", { total: X }) : I("admin.tenants.description", "Manage all tenants on the platform"),
241
+ actions: w && Se ? /* @__PURE__ */ b(i, {
242
+ onClick: Me,
243
+ disabled: Oe || ke,
244
+ children: [/* @__PURE__ */ y(ge, { className: "mr-2 h-4 w-4" }), I("admin.tenants.actions.createTenant", "Create Tenant")]
236
245
  }) : void 0,
237
- children: [/* @__PURE__ */ x("div", {
246
+ children: [/* @__PURE__ */ b("div", {
238
247
  className: "space-y-4",
239
248
  children: [
240
- /* @__PURE__ */ x("div", {
249
+ /* @__PURE__ */ y(ye, { children: I("admin.tenants.purpose", "Tenants are the isolated customer accounts on the platform — each with its own users, data, plan and billing. Use this page to find a tenant, onboard a new one, and suspend or reactivate access when a customer churns or returns.") }),
250
+ /* @__PURE__ */ b(ve, {
251
+ className: "flex items-center gap-4 p-5",
252
+ children: [/* @__PURE__ */ y("div", {
253
+ className: "flex h-12 w-12 flex-shrink-0 items-center justify-center rounded-full bg-action-primary-bg/15 text-action-primary-bg",
254
+ children: /* @__PURE__ */ y(g, { className: "h-6 w-6" })
255
+ }), /* @__PURE__ */ b("div", { children: [/* @__PURE__ */ y("div", {
256
+ className: "text-3xl font-bold tabular-nums text-text-primary",
257
+ children: o(X)
258
+ }), /* @__PURE__ */ y("p", {
259
+ className: "text-sm text-text-secondary",
260
+ children: I("admin.tenants.emphasis.label", "tenants on the platform")
261
+ })] })]
262
+ }),
263
+ /* @__PURE__ */ b("div", {
241
264
  className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
242
- children: [/* @__PURE__ */ x("div", {
265
+ children: [/* @__PURE__ */ b("div", {
243
266
  className: "relative max-w-sm flex-1",
244
- children: [/* @__PURE__ */ b(pe, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ b(ee, {
245
- placeholder: L("admin.tenants.searchPlaceholder", "Search tenants..."),
246
- value: k.search,
267
+ children: [/* @__PURE__ */ y(_, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-text-secondary" }), /* @__PURE__ */ y(te, {
268
+ placeholder: I("admin.tenants.searchPlaceholder", "Search tenants..."),
269
+ value: O.search,
247
270
  onChange: (e) => {
248
- z(1), A({ search: e.target.value });
271
+ R(1), k({ search: e.target.value });
249
272
  },
250
273
  className: "pl-9"
251
274
  })]
252
- }), /* @__PURE__ */ x("div", {
275
+ }), /* @__PURE__ */ b("div", {
253
276
  className: "flex items-center gap-2",
254
- children: [/* @__PURE__ */ x("select", {
255
- value: k.status,
277
+ children: [/* @__PURE__ */ b("select", {
278
+ value: O.status,
256
279
  onChange: (e) => {
257
- z(1), A({ status: e.target.value });
280
+ R(1), k({ status: e.target.value });
258
281
  },
259
282
  className: "h-10 rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm ring-offset-background focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)] focus:ring-offset-2",
260
283
  children: [
261
- /* @__PURE__ */ b("option", {
284
+ /* @__PURE__ */ y("option", {
262
285
  value: "all",
263
- children: L("admin.tenants.filters.status.all", "All Status")
286
+ children: I("admin.tenants.filters.status.all", "All Status")
264
287
  }),
265
- /* @__PURE__ */ b("option", {
288
+ /* @__PURE__ */ y("option", {
266
289
  value: "active",
267
- children: L("admin.tenants.filters.status.active", "Active")
290
+ children: I("admin.tenants.filters.status.active", "Active")
268
291
  }),
269
- /* @__PURE__ */ b("option", {
292
+ /* @__PURE__ */ y("option", {
270
293
  value: "suspended",
271
- children: L("admin.tenants.filters.status.suspended", "Suspended")
294
+ children: I("admin.tenants.filters.status.suspended", "Suspended")
272
295
  }),
273
- /* @__PURE__ */ b("option", {
296
+ /* @__PURE__ */ y("option", {
274
297
  value: "deleted",
275
- children: L("admin.tenants.filters.status.deleted", "Deleted")
298
+ children: I("admin.tenants.filters.status.deleted", "Deleted")
276
299
  })
277
300
  ]
278
- }), (k.search || k.status !== "all") && /* @__PURE__ */ b(i, {
301
+ }), (O.search || O.status !== "all") && /* @__PURE__ */ y(i, {
279
302
  variant: "ghost",
280
303
  onClick: () => {
281
- z(1), j();
304
+ R(1), A();
282
305
  },
283
- children: L("admin.tenants.filters.clear", "Clear")
306
+ children: I("admin.tenants.filters.clear", "Clear")
284
307
  })]
285
308
  })]
286
309
  }),
287
- W && /* @__PURE__ */ x("div", {
310
+ W && /* @__PURE__ */ b("div", {
288
311
  className: "rounded-md border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
289
312
  children: [
290
- L("admin.tenants.error.loadFailed", "Failed to load tenants"),
313
+ I("admin.tenants.error.loadFailed", "Failed to load tenants"),
291
314
  ": ",
292
315
  W.message
293
316
  ]
294
317
  }),
295
- /* @__PURE__ */ b(c, {
296
- columns: ke,
297
- data: Ce,
318
+ /* @__PURE__ */ y(ae, {
319
+ columns: Ie,
320
+ data: Ae,
298
321
  keyExtractor: (e) => e.id,
299
- onRowClick: De,
300
- sortBy: k.sortBy,
301
- sortOrder: k.sortOrder,
302
- onSort: (e, t) => A({
322
+ onRowClick: Pe,
323
+ sortBy: O.sortBy,
324
+ sortOrder: O.sortOrder,
325
+ onSort: (e, t) => k({
303
326
  sortBy: e,
304
327
  sortOrder: t
305
328
  }),
306
- loading: be,
307
- emptyState: /* @__PURE__ */ b(a, {
329
+ loading: De,
330
+ emptyState: /* @__PURE__ */ y(ee, {
308
331
  illustration: "empty-search",
309
- icon: /* @__PURE__ */ b(y, { className: "h-8 w-8" }),
310
- title: L("admin.tenants.empty.title", "No tenants found"),
311
- description: L("admin.tenants.empty.description", "Try adjusting your search or filters"),
312
- action: /* @__PURE__ */ b(i, {
332
+ icon: /* @__PURE__ */ y(g, { className: "h-8 w-8" }),
333
+ title: I("admin.tenants.empty.title", "No tenants found"),
334
+ description: I("admin.tenants.empty.description", "Try adjusting your search or filters"),
335
+ action: /* @__PURE__ */ y(i, {
313
336
  variant: "outline",
314
337
  onClick: () => {
315
- z(1), j();
338
+ R(1), A();
316
339
  },
317
- children: L("admin.tenants.empty.clearFilters", "Clear filters")
340
+ children: I("admin.tenants.empty.clearFilters", "Clear filters")
318
341
  })
319
342
  })
320
343
  }),
321
- X > C && /* @__PURE__ */ b(l, {
322
- page: R,
323
- totalPages: we,
344
+ X > S && /* @__PURE__ */ y(oe, {
345
+ page: L,
346
+ totalPages: je,
324
347
  totalItems: X,
325
- pageSize: C,
326
- onPageChange: z
348
+ pageSize: S,
349
+ onPageChange: R
327
350
  })
328
351
  ]
329
- }), /* @__PURE__ */ b(ae, {
330
- open: B,
331
- onClose: () => V(!1),
332
- tenant: _e,
333
- onSave: Ee
352
+ }), /* @__PURE__ */ y(se, {
353
+ open: Ce,
354
+ onClose: () => z(!1),
355
+ tenant: we,
356
+ onSave: Ne
334
357
  })]
335
358
  })
359
+ }) : /* @__PURE__ */ y(a, {
360
+ title: I("admin.tenants.featureDisabledTitle", "Tenant management unavailable"),
361
+ description: I("admin.tenants.featureDisabled", "This feature is currently disabled."),
362
+ children: null
336
363
  });
337
364
  }
338
365
  //#endregion
339
- export { w as TenantsListPage };
366
+ export { C as TenantsListPage };
340
367
 
341
368
  //# sourceMappingURL=TenantsListPage.js.map