@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.
- package/dist/admin/AdminRoot.js +2 -2
- package/dist/admin/AdminRoot.js.map +1 -1
- package/dist/admin/AdminRoutes.js +130 -78
- package/dist/admin/AdminRoutes.js.map +1 -1
- package/dist/admin/components/AccessDenied.js +2 -2
- package/dist/admin/components/AccessDenied.js.map +1 -1
- package/dist/admin/components/ActivityFeed.js +4 -4
- package/dist/admin/components/ActivityFeed.js.map +1 -1
- package/dist/admin/components/Charts.js.map +1 -1
- package/dist/admin/components/ConfirmDialog.js +1 -1
- package/dist/admin/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/components/DataTable.js.map +1 -1
- package/dist/admin/components/FormSheet.js +1 -1
- package/dist/admin/components/FormSheet.js.map +1 -1
- package/dist/admin/components/TenantSsoPanel.js +1 -1
- package/dist/admin/components/TenantSsoPanel.js.map +1 -1
- package/dist/admin/components/Toast.js +11 -11
- package/dist/admin/components/Toast.js.map +1 -1
- package/dist/admin/components/forms/SubscriptionForm.js +2 -2
- package/dist/admin/components/forms/SubscriptionForm.js.map +1 -1
- package/dist/admin/components/forms/TenantForm.js +1 -1
- package/dist/admin/components/forms/UserForm.js +1 -1
- package/dist/admin/components/ui.js +3 -3
- package/dist/admin/components/ui.js.map +1 -1
- package/dist/admin/constants/featureFlags.js +12 -0
- package/dist/admin/constants/featureFlags.js.map +1 -0
- package/dist/admin/constants/index.js +33 -24
- package/dist/admin/constants/index.js.map +1 -1
- package/dist/admin/pages/AuditLogsPage.js +92 -77
- package/dist/admin/pages/AuditLogsPage.js.map +1 -1
- package/dist/admin/pages/BillingPage.js +95 -51
- package/dist/admin/pages/BillingPage.js.map +1 -1
- package/dist/admin/pages/CommunicationsPage.js +97 -92
- package/dist/admin/pages/CommunicationsPage.js.map +1 -1
- package/dist/admin/pages/ContentPagesPage.js +274 -259
- package/dist/admin/pages/ContentPagesPage.js.map +1 -1
- package/dist/admin/pages/DashboardPage.js +113 -84
- package/dist/admin/pages/DashboardPage.js.map +1 -1
- package/dist/admin/pages/FeatureFlagsPage.js +93 -75
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -1
- package/dist/admin/pages/OrganizationsListPage.js +105 -87
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -1
- package/dist/admin/pages/ProductsPage.js +138 -130
- package/dist/admin/pages/ProductsPage.js.map +1 -1
- package/dist/admin/pages/ReferralsPage.js +70 -52
- package/dist/admin/pages/ReferralsPage.js.map +1 -1
- package/dist/admin/pages/RolesPermissionsPage.js +136 -118
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -1
- package/dist/admin/pages/SREPage.js +34 -32
- package/dist/admin/pages/SREPage.js.map +1 -1
- package/dist/admin/pages/SandboxSettingsPage.js +360 -322
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage.js +64 -61
- package/dist/admin/pages/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SyncFailuresPage.js +120 -118
- package/dist/admin/pages/SyncFailuresPage.js.map +1 -1
- package/dist/admin/pages/TenantDetailPage.js +286 -231
- package/dist/admin/pages/TenantDetailPage.js.map +1 -1
- package/dist/admin/pages/TenantFormRoutePage.js +78 -73
- package/dist/admin/pages/TenantFormRoutePage.js.map +1 -1
- package/dist/admin/pages/TenantsListPage.js +182 -155
- package/dist/admin/pages/TenantsListPage.js.map +1 -1
- package/dist/admin/pages/UsersListPage.js +128 -113
- package/dist/admin/pages/UsersListPage.js.map +1 -1
- package/dist/admin/pages/WaitlistPage.js +78 -63
- package/dist/admin/pages/WaitlistPage.js.map +1 -1
- package/dist/admin/pages/WorkflowsPage.js +107 -102
- package/dist/admin/pages/WorkflowsPage.js.map +1 -1
- package/dist/admin/pages/WorkspacesListPage.js +61 -49
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -1
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +2 -2
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -1
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +35 -26
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -1
- package/dist/node_modules/react-hook-form/dist/index.esm.js +609 -516
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -1
- 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
|
|
5
|
-
import { PageLayout as
|
|
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
|
|
8
|
-
import { DataTable as
|
|
9
|
-
import { tWithFallback as
|
|
10
|
-
import { TenantForm as
|
|
11
|
-
import { RowActions as
|
|
12
|
-
import { PermissionGuard as
|
|
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
|
|
15
|
-
import { mapTenantToUi as
|
|
16
|
-
import { useActivateTenantMutation as
|
|
17
|
-
import { useAdminStore as
|
|
18
|
-
import { emitTenantLifecycle as
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
25
|
-
import {
|
|
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
|
|
28
|
-
function
|
|
29
|
-
let { canViewTenants:
|
|
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
|
-
|
|
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
|
|
38
|
-
}, [
|
|
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:
|
|
41
|
-
limit:
|
|
42
|
-
offset: (
|
|
42
|
+
filter: Te,
|
|
43
|
+
limit: S,
|
|
44
|
+
offset: (L - 1) * S
|
|
43
45
|
},
|
|
44
46
|
fetchPolicy: "cache-and-network",
|
|
45
|
-
skip:
|
|
46
|
-
}), [K, { loading:
|
|
47
|
+
skip: Ee
|
|
48
|
+
}), [K, { loading: Oe }] = de({ onCompleted: () => {
|
|
47
49
|
G();
|
|
48
|
-
} }), [q, { loading:
|
|
50
|
+
} }), [q, { loading: ke }] = me({ onCompleted: () => {
|
|
49
51
|
G();
|
|
50
|
-
} }), [J] =
|
|
52
|
+
} }), [J] = pe({ onCompleted: () => {
|
|
51
53
|
G();
|
|
52
|
-
} }), [Y] =
|
|
54
|
+
} }), [Y] = ue({ onCompleted: () => {
|
|
53
55
|
G();
|
|
54
|
-
} }),
|
|
55
|
-
|
|
56
|
-
}, []), Z =
|
|
57
|
-
|
|
58
|
-
}, []), Q =
|
|
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 } }),
|
|
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
|
-
}),
|
|
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
|
-
|
|
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
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
]), $ =
|
|
72
|
+
j,
|
|
73
|
+
I,
|
|
74
|
+
F
|
|
75
|
+
]), $ = p(async (e) => {
|
|
74
76
|
try {
|
|
75
|
-
await Y({ variables: { id: e.id } }),
|
|
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
|
-
}),
|
|
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
|
-
|
|
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
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
]),
|
|
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
|
-
|
|
106
|
+
d(F, "tenant.tenant.updated", {
|
|
105
107
|
tenantId: n,
|
|
106
108
|
tenantSlug: r
|
|
107
|
-
}),
|
|
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 &&
|
|
121
|
+
t?.id && d(F, "tenant.tenant.created", {
|
|
120
122
|
tenantId: t.id,
|
|
121
123
|
tenantSlug: t.slug
|
|
122
|
-
}),
|
|
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
|
-
|
|
126
|
+
z(!1);
|
|
125
127
|
} catch (e) {
|
|
126
128
|
let n = e instanceof Error ? e.message : "Unknown error";
|
|
127
|
-
throw
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
]),
|
|
136
|
-
|
|
137
|
-
},
|
|
138
|
-
let t =
|
|
139
|
-
onView: () =>
|
|
140
|
-
onEdit:
|
|
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
|
|
144
|
+
return H && t.push({
|
|
143
145
|
key: e.status === "active" ? "suspend" : "activate",
|
|
144
|
-
label: e.status === "active" ?
|
|
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
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
+
w,
|
|
154
|
+
H,
|
|
155
|
+
P,
|
|
153
156
|
Z,
|
|
154
157
|
Q,
|
|
155
158
|
$,
|
|
156
|
-
|
|
157
|
-
]),
|
|
159
|
+
I
|
|
160
|
+
]), Ie = [
|
|
158
161
|
{
|
|
159
162
|
key: "name",
|
|
160
|
-
header:
|
|
163
|
+
header: I("admin.tenants.table.tenant", "Tenant"),
|
|
161
164
|
sortable: !0,
|
|
162
|
-
render: (e) => /* @__PURE__ */
|
|
165
|
+
render: (e) => /* @__PURE__ */ b("div", {
|
|
163
166
|
className: "flex items-center gap-3",
|
|
164
|
-
children: [/* @__PURE__ */
|
|
167
|
+
children: [/* @__PURE__ */ y(r, {
|
|
165
168
|
fallback: e.name.slice(0, 2).toUpperCase(),
|
|
166
169
|
size: "sm"
|
|
167
|
-
}), /* @__PURE__ */
|
|
170
|
+
}), /* @__PURE__ */ b("div", {
|
|
168
171
|
className: "min-w-0",
|
|
169
|
-
children: [/* @__PURE__ */
|
|
172
|
+
children: [/* @__PURE__ */ y("div", {
|
|
170
173
|
className: "truncate font-medium text-text-primary",
|
|
171
174
|
children: e.name
|
|
172
|
-
}), /* @__PURE__ */
|
|
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:
|
|
184
|
+
header: I("admin.tenants.table.status", "Status"),
|
|
182
185
|
width: "120px",
|
|
183
|
-
render: (e) => /* @__PURE__ */
|
|
186
|
+
render: (e) => /* @__PURE__ */ y(ne, { status: e.status })
|
|
184
187
|
},
|
|
185
188
|
{
|
|
186
189
|
key: "plan",
|
|
187
|
-
header:
|
|
190
|
+
header: I("admin.tenants.table.plan", "Plan"),
|
|
188
191
|
width: "100px"
|
|
189
192
|
},
|
|
190
193
|
{
|
|
191
194
|
key: "userCount",
|
|
192
|
-
header:
|
|
195
|
+
header: I("admin.tenants.table.users", "Users"),
|
|
193
196
|
width: "80px",
|
|
194
197
|
align: "right",
|
|
195
198
|
sortable: !0,
|
|
196
|
-
render: (e) =>
|
|
199
|
+
render: (e) => o(e.userCount)
|
|
197
200
|
},
|
|
198
201
|
{
|
|
199
202
|
key: "storageUsed",
|
|
200
|
-
header:
|
|
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:
|
|
210
|
+
header: I("admin.tenants.table.created", "Created"),
|
|
208
211
|
width: "120px",
|
|
209
212
|
sortable: !0,
|
|
210
|
-
render: (e) =>
|
|
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__ */
|
|
218
|
-
actions:
|
|
219
|
-
ariaLabel:
|
|
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__ */
|
|
224
|
-
allowed:
|
|
225
|
-
isLoading:
|
|
226
|
-
pageTitle:
|
|
227
|
-
denyMessage:
|
|
228
|
-
children:
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
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__ */
|
|
246
|
+
children: [/* @__PURE__ */ b("div", {
|
|
238
247
|
className: "space-y-4",
|
|
239
248
|
children: [
|
|
240
|
-
/* @__PURE__ */
|
|
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__ */
|
|
265
|
+
children: [/* @__PURE__ */ b("div", {
|
|
243
266
|
className: "relative max-w-sm flex-1",
|
|
244
|
-
children: [/* @__PURE__ */
|
|
245
|
-
placeholder:
|
|
246
|
-
value:
|
|
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
|
-
|
|
271
|
+
R(1), k({ search: e.target.value });
|
|
249
272
|
},
|
|
250
273
|
className: "pl-9"
|
|
251
274
|
})]
|
|
252
|
-
}), /* @__PURE__ */
|
|
275
|
+
}), /* @__PURE__ */ b("div", {
|
|
253
276
|
className: "flex items-center gap-2",
|
|
254
|
-
children: [/* @__PURE__ */
|
|
255
|
-
value:
|
|
277
|
+
children: [/* @__PURE__ */ b("select", {
|
|
278
|
+
value: O.status,
|
|
256
279
|
onChange: (e) => {
|
|
257
|
-
|
|
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__ */
|
|
284
|
+
/* @__PURE__ */ y("option", {
|
|
262
285
|
value: "all",
|
|
263
|
-
children:
|
|
286
|
+
children: I("admin.tenants.filters.status.all", "All Status")
|
|
264
287
|
}),
|
|
265
|
-
/* @__PURE__ */
|
|
288
|
+
/* @__PURE__ */ y("option", {
|
|
266
289
|
value: "active",
|
|
267
|
-
children:
|
|
290
|
+
children: I("admin.tenants.filters.status.active", "Active")
|
|
268
291
|
}),
|
|
269
|
-
/* @__PURE__ */
|
|
292
|
+
/* @__PURE__ */ y("option", {
|
|
270
293
|
value: "suspended",
|
|
271
|
-
children:
|
|
294
|
+
children: I("admin.tenants.filters.status.suspended", "Suspended")
|
|
272
295
|
}),
|
|
273
|
-
/* @__PURE__ */
|
|
296
|
+
/* @__PURE__ */ y("option", {
|
|
274
297
|
value: "deleted",
|
|
275
|
-
children:
|
|
298
|
+
children: I("admin.tenants.filters.status.deleted", "Deleted")
|
|
276
299
|
})
|
|
277
300
|
]
|
|
278
|
-
}), (
|
|
301
|
+
}), (O.search || O.status !== "all") && /* @__PURE__ */ y(i, {
|
|
279
302
|
variant: "ghost",
|
|
280
303
|
onClick: () => {
|
|
281
|
-
|
|
304
|
+
R(1), A();
|
|
282
305
|
},
|
|
283
|
-
children:
|
|
306
|
+
children: I("admin.tenants.filters.clear", "Clear")
|
|
284
307
|
})]
|
|
285
308
|
})]
|
|
286
309
|
}),
|
|
287
|
-
W && /* @__PURE__ */
|
|
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
|
-
|
|
313
|
+
I("admin.tenants.error.loadFailed", "Failed to load tenants"),
|
|
291
314
|
": ",
|
|
292
315
|
W.message
|
|
293
316
|
]
|
|
294
317
|
}),
|
|
295
|
-
/* @__PURE__ */
|
|
296
|
-
columns:
|
|
297
|
-
data:
|
|
318
|
+
/* @__PURE__ */ y(ae, {
|
|
319
|
+
columns: Ie,
|
|
320
|
+
data: Ae,
|
|
298
321
|
keyExtractor: (e) => e.id,
|
|
299
|
-
onRowClick:
|
|
300
|
-
sortBy:
|
|
301
|
-
sortOrder:
|
|
302
|
-
onSort: (e, t) =>
|
|
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:
|
|
307
|
-
emptyState: /* @__PURE__ */
|
|
329
|
+
loading: De,
|
|
330
|
+
emptyState: /* @__PURE__ */ y(ee, {
|
|
308
331
|
illustration: "empty-search",
|
|
309
|
-
icon: /* @__PURE__ */
|
|
310
|
-
title:
|
|
311
|
-
description:
|
|
312
|
-
action: /* @__PURE__ */
|
|
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
|
-
|
|
338
|
+
R(1), A();
|
|
316
339
|
},
|
|
317
|
-
children:
|
|
340
|
+
children: I("admin.tenants.empty.clearFilters", "Clear filters")
|
|
318
341
|
})
|
|
319
342
|
})
|
|
320
343
|
}),
|
|
321
|
-
X >
|
|
322
|
-
page:
|
|
323
|
-
totalPages:
|
|
344
|
+
X > S && /* @__PURE__ */ y(oe, {
|
|
345
|
+
page: L,
|
|
346
|
+
totalPages: je,
|
|
324
347
|
totalItems: X,
|
|
325
|
-
pageSize:
|
|
326
|
-
onPageChange:
|
|
348
|
+
pageSize: S,
|
|
349
|
+
onPageChange: R
|
|
327
350
|
})
|
|
328
351
|
]
|
|
329
|
-
}), /* @__PURE__ */
|
|
330
|
-
open:
|
|
331
|
-
onClose: () =>
|
|
332
|
-
tenant:
|
|
333
|
-
onSave:
|
|
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 {
|
|
366
|
+
export { C as TenantsListPage };
|
|
340
367
|
|
|
341
368
|
//# sourceMappingURL=TenantsListPage.js.map
|