@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,285 +1,340 @@
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, Card as a, CardContent as o, CardHeader as s, CardTitle as c, Separator as l } from "../components/ui.js";
5
- import { PageLayout as u } from "../components/PageLayout.js";
6
- import { TenantStatusBadge as d } from "../components/StatusBadge.js";
7
- import { formatDate as f } from "../utils/formatters.js";
8
- import { tWithFallback as p } from "../utils/i18n.js";
9
- import { PermissionGuard as ee } from "../components/PermissionGuard.js";
4
+ import { Avatar as r, Button as i, Card as a, CardContent as o, CardHeader as s, CardTitle as c, Separator as ee } from "../components/ui.js";
5
+ import { PageLayout as l } from "../components/PageLayout.js";
6
+ import { TenantStatusBadge as te } from "../components/StatusBadge.js";
7
+ import { formatDate as u } from "../utils/formatters.js";
8
+ import { tWithFallback as ne } from "../utils/i18n.js";
9
+ import { PermissionGuard as d } from "../components/PermissionGuard.js";
10
10
  import "../components/index.js";
11
- import { joinPath as m } from "../utils/navigation.js";
12
- import { mapTenantToUi as h } from "../utils/mappers.js";
13
- import { useActivateTenantMutation as g, useGetTenantQuery as _, useSuspendTenantMutation as v } from "../../generated/global-operations.js";
14
- import { emitTenantLifecycle as y } from "../utils/tenantEvents.js";
15
- import { TenantMembersPanel as b } from "../components/TenantMembersPanel.js";
16
- import { TenantSsoPanel as x } from "../components/TenantSsoPanel.js";
17
- import { ArrowLeft as S, Ban as C, Building2 as w, Calendar as T, CheckCircle as E, Globe as D, Loader2 as O, Mail as te, Settings as ne, Users as re } from "lucide-react";
18
- import { useNavigate as k, useParams as A } from "react-router-dom";
19
- import { jsx as j, jsxs as M } from "react/jsx-runtime";
20
- import { useI18n as N } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
21
- import { useEventBus as P } from "@burdenoff/fe-libs/shared/events";
11
+ import { joinPath as f } from "../utils/navigation.js";
12
+ import { mapTenantToUi as p } from "../utils/mappers.js";
13
+ import { useActivateTenantMutation as m, useGetTenantQuery as h, useSuspendTenantMutation as g } from "../../generated/global-operations.js";
14
+ import { emitTenantLifecycle as _ } from "../utils/tenantEvents.js";
15
+ import { TENANT_FEATURE_FLAGS as v } from "../constants/featureFlags.js";
16
+ import { TenantMembersPanel as re } from "../components/TenantMembersPanel.js";
17
+ import { TenantSsoPanel as ie } from "../components/TenantSsoPanel.js";
18
+ import { ArrowLeft as y, Ban as ae, Building2 as oe, Calendar as b, CheckCircle as se, Globe as x, Loader2 as S, Mail as C, Settings as w, Users as ce } from "lucide-react";
19
+ import { useNavigate as le, useParams as ue } from "react-router-dom";
20
+ import { jsx as T, jsxs as E } from "react/jsx-runtime";
21
+ import { useFeatureFlag as D } from "@burdenoff/fe-libs/shared/feature-flags";
22
+ import { useI18n as O } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
23
+ import { EmphasisPanel as k, NextSteps as A, PagePurpose as j } from "@burdenoff/fe-libs/ui";
24
+ import { useEventBus as M } from "@burdenoff/fe-libs/shared/events";
22
25
  //#region src/admin/pages/TenantDetailPage.tsx
23
- function F() {
24
- let { canViewTenants: F, canManageTenants: I, isLoading: L } = n(), { tenantId: R } = A(), z = k(), { basePath: B = "" } = t(), V = e(), { t: H } = N(), U = (e, t, n) => p(H, e, t, n), { data: W, loading: G, error: K } = _({
25
- variables: { id: R },
26
- skip: !R || L || !F,
26
+ function N() {
27
+ let { canViewTenants: N, canManageTenants: P, isLoading: F } = n(), { tenantId: I } = ue(), L = le(), { basePath: R = "" } = t(), z = e(), { t: B } = O(), V = D(v.management, !0), H = D(v.detail, !0), U = D(v.edit, !0), W = V && H, G = P && U, de = P && V, K = (e, t, n) => ne(B, e, t, n), { data: q, loading: fe, error: J } = h({
28
+ variables: { id: I },
29
+ skip: !I || F || !N || !W,
27
30
  fetchPolicy: "cache-and-network"
28
- }), [q, { loading: J }] = v(), [Y, { loading: X }] = g(), Z = P(), Q = W?.tenant ? h(W.tenant) : null, ie = async () => {
29
- if (!R) return;
31
+ }), [pe, { loading: Y }] = g(), [me, { loading: X }] = m(), Z = M(), Q = q?.tenant ? p(q.tenant) : null, he = async () => {
32
+ if (!I) return;
30
33
  let e = Q?.slug;
31
34
  try {
32
- await q({ variables: { id: R } }), y(Z, "tenant.tenant.suspended", {
33
- tenantId: R,
35
+ await pe({ variables: { id: I } }), _(Z, "tenant.tenant.suspended", {
36
+ tenantId: I,
34
37
  tenantSlug: e,
35
38
  status: "SUSPENDED"
36
- }), V.success(U("admin.tenantDetail.toast.suspendedTitle", "Tenant suspended"), U("admin.tenantDetail.toast.suspendedDescription", "{{name}} has been suspended.", { name: Q?.name ?? "" }));
39
+ }), z.success(K("admin.tenantDetail.toast.suspendedTitle", "Tenant suspended"), K("admin.tenantDetail.toast.suspendedDescription", "{{name}} has been suspended.", { name: Q?.name ?? "" }));
37
40
  } catch (e) {
38
- V.error(U("admin.tenantDetail.toast.errorTitle", "Error"), e instanceof Error ? e.message : U("admin.tenantDetail.toast.suspendFailed", "Failed to suspend tenant."));
41
+ z.error(K("admin.tenantDetail.toast.errorTitle", "Error"), e instanceof Error ? e.message : K("admin.tenantDetail.toast.suspendFailed", "Failed to suspend tenant."));
39
42
  }
40
- }, ae = async () => {
41
- if (!R) return;
43
+ }, ge = async () => {
44
+ if (!I) return;
42
45
  let e = Q?.slug;
43
46
  try {
44
- await Y({ variables: { id: R } }), y(Z, "tenant.tenant.activated", {
45
- tenantId: R,
47
+ await me({ variables: { id: I } }), _(Z, "tenant.tenant.activated", {
48
+ tenantId: I,
46
49
  tenantSlug: e,
47
50
  status: "ACTIVE"
48
- }), V.success(U("admin.tenantDetail.toast.activatedTitle", "Tenant activated"), U("admin.tenantDetail.toast.activatedDescription", "{{name}} has been activated.", { name: Q?.name ?? "" }));
51
+ }), z.success(K("admin.tenantDetail.toast.activatedTitle", "Tenant activated"), K("admin.tenantDetail.toast.activatedDescription", "{{name}} has been activated.", { name: Q?.name ?? "" }));
49
52
  } catch (e) {
50
- V.error(U("admin.tenantDetail.toast.errorTitle", "Error"), e instanceof Error ? e.message : U("admin.tenantDetail.toast.activateFailed", "Failed to activate tenant."));
53
+ z.error(K("admin.tenantDetail.toast.errorTitle", "Error"), e instanceof Error ? e.message : K("admin.tenantDetail.toast.activateFailed", "Failed to activate tenant."));
51
54
  }
52
- }, $ = W?.tenant?.workspaces ?? [];
53
- return /* @__PURE__ */ j(ee, {
54
- allowed: F,
55
- isLoading: L,
56
- pageTitle: U("admin.tenantDetail.pageTitle", "Tenant Details"),
57
- denyMessage: U("admin.tenantDetail.denyMessage", "You don't have permission to view tenant details."),
58
- children: G ? /* @__PURE__ */ j(u, {
59
- title: U("admin.tenantDetail.loadingTitle", "Loading..."),
60
- children: /* @__PURE__ */ j("div", {
55
+ }, $ = q?.tenant?.workspaces ?? [];
56
+ return !F && !N ? /* @__PURE__ */ T(d, {
57
+ allowed: !1,
58
+ isLoading: !1,
59
+ pageTitle: K("admin.tenantDetail.pageTitle", "Tenant Details"),
60
+ denyMessage: K("admin.tenantDetail.denyMessage", "You don't have permission to view tenant details."),
61
+ children: null
62
+ }) : W ? /* @__PURE__ */ T(d, {
63
+ allowed: N,
64
+ isLoading: F,
65
+ pageTitle: K("admin.tenantDetail.pageTitle", "Tenant Details"),
66
+ denyMessage: K("admin.tenantDetail.denyMessage", "You don't have permission to view tenant details."),
67
+ children: fe ? /* @__PURE__ */ T(l, {
68
+ title: K("admin.tenantDetail.loadingTitle", "Loading..."),
69
+ children: /* @__PURE__ */ T("div", {
61
70
  className: "flex h-64 items-center justify-center",
62
- children: /* @__PURE__ */ j(O, { className: "h-8 w-8 animate-spin text-text-secondary" })
71
+ children: /* @__PURE__ */ T(S, { className: "h-8 w-8 animate-spin text-text-secondary" })
63
72
  })
64
- }) : K || !Q ? /* @__PURE__ */ M(u, {
65
- title: U("admin.tenantDetail.notFoundTitle", "Tenant Not Found"),
66
- description: U("admin.tenantDetail.notFoundDescription", "The requested tenant could not be found"),
67
- children: [K && /* @__PURE__ */ j("div", {
73
+ }) : J || !Q ? /* @__PURE__ */ E(l, {
74
+ title: K("admin.tenantDetail.notFoundTitle", "Tenant Not Found"),
75
+ description: K("admin.tenantDetail.notFoundDescription", "The requested tenant could not be found"),
76
+ children: [J && /* @__PURE__ */ T("div", {
68
77
  className: "mb-4 rounded-md border border-status-error-border/50 bg-status-error-bg/10 p-4 text-sm text-status-error-text",
69
- children: K.message
70
- }), /* @__PURE__ */ M(i, {
78
+ children: J.message
79
+ }), /* @__PURE__ */ E(i, {
71
80
  variant: "outline",
72
- onClick: () => z(m(B, "tenants")),
73
- children: [/* @__PURE__ */ j(S, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.backToTenants", "Back to Tenants")]
81
+ onClick: () => L(f(R, "tenants")),
82
+ children: [/* @__PURE__ */ T(y, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.backToTenants", "Back to Tenants")]
74
83
  })]
75
- }) : /* @__PURE__ */ j(u, {
84
+ }) : /* @__PURE__ */ E(l, {
76
85
  title: Q.name,
77
- description: U("admin.tenantDetail.tenantId", "Tenant ID: {{id}}", { id: Q.id }),
78
- actions: /* @__PURE__ */ M("div", {
86
+ description: K("admin.tenantDetail.tenantId", "Tenant ID: {{id}}", { id: Q.id }),
87
+ actions: /* @__PURE__ */ E("div", {
79
88
  className: "flex items-center gap-2",
80
89
  children: [
81
- /* @__PURE__ */ M(i, {
90
+ /* @__PURE__ */ E(i, {
82
91
  variant: "outline",
83
- onClick: () => z(m(B, "tenants")),
84
- children: [/* @__PURE__ */ j(S, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.back", "Back")]
92
+ onClick: () => L(f(R, "tenants")),
93
+ children: [/* @__PURE__ */ T(y, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.back", "Back")]
85
94
  }),
86
- I && /* @__PURE__ */ M(i, {
95
+ G && /* @__PURE__ */ E(i, {
87
96
  variant: "outline",
88
- onClick: () => z(m(B, `tenants/${Q.id}/edit`)),
89
- children: [/* @__PURE__ */ j(ne, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.edit", "Edit")]
97
+ onClick: () => L(f(R, `tenants/${Q.id}/edit`)),
98
+ children: [/* @__PURE__ */ T(w, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.edit", "Edit")]
90
99
  }),
91
- I && (Q.status === "active" ? /* @__PURE__ */ M(i, {
100
+ de && (Q.status === "active" ? /* @__PURE__ */ E(i, {
92
101
  variant: "outline",
93
- className: "text-warning",
94
- onClick: ie,
95
- disabled: J,
96
- children: [J ? /* @__PURE__ */ j(O, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ j(C, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.suspend", "Suspend")]
97
- }) : /* @__PURE__ */ M(i, {
102
+ className: "text-status-warning-text",
103
+ onClick: he,
104
+ disabled: Y,
105
+ children: [Y ? /* @__PURE__ */ T(S, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ T(ae, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.suspend", "Suspend")]
106
+ }) : /* @__PURE__ */ E(i, {
98
107
  variant: "outline",
99
- className: "text-success",
100
- onClick: ae,
108
+ className: "text-status-success-text",
109
+ onClick: ge,
101
110
  disabled: X,
102
- children: [X ? /* @__PURE__ */ j(O, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ j(E, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.activate", "Activate")]
111
+ children: [X ? /* @__PURE__ */ T(S, { className: "mr-2 h-4 w-4 animate-spin" }) : /* @__PURE__ */ T(se, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.activate", "Activate")]
103
112
  }))
104
113
  ]
105
114
  }),
106
- children: /* @__PURE__ */ M("div", {
107
- className: "grid gap-6 lg:grid-cols-3",
108
- children: [/* @__PURE__ */ M("div", {
109
- className: "space-y-6 lg:col-span-2",
110
- children: [
111
- /* @__PURE__ */ M(a, { children: [/* @__PURE__ */ j(s, { children: /* @__PURE__ */ j(c, {
112
- className: "text-lg",
113
- children: U("admin.tenantDetail.overview.title", "Overview")
114
- }) }), /* @__PURE__ */ M(o, { children: [
115
- /* @__PURE__ */ M("div", {
116
- className: "flex items-start gap-4",
117
- children: [/* @__PURE__ */ j(r, {
118
- fallback: Q.name.slice(0, 2).toUpperCase(),
119
- size: "lg"
120
- }), /* @__PURE__ */ M("div", {
121
- className: "flex-1 space-y-4",
122
- children: [/* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("h2", {
123
- className: "text-xl font-semibold text-text-primary",
124
- children: Q.name
125
- }), /* @__PURE__ */ M("p", {
126
- className: "text-sm text-text-secondary",
127
- children: ["@", Q.slug]
128
- })] }), /* @__PURE__ */ M("div", {
129
- className: "flex flex-wrap items-center gap-4",
130
- children: [/* @__PURE__ */ j(d, { status: Q.status }), Q.plan && /* @__PURE__ */ j("span", {
131
- className: "rounded-md bg-action-primary-bg/10 px-2 py-1 text-xs font-medium text-primary",
132
- children: Q.plan
133
- })]
134
- })]
135
- })]
115
+ children: [
116
+ /* @__PURE__ */ T(j, {
117
+ className: "mb-6",
118
+ children: K("admin.tenantDetail.purpose", "Everything about a single tenant in one place — their profile, the people inside it, and their single sign-on setup. From here you manage that one customer account: review who has access, adjust their SSO, and suspend or reactivate them when needed.")
119
+ }),
120
+ /* @__PURE__ */ T(A, {
121
+ storageKey: "admin-tenant-detail",
122
+ steps: [
123
+ {
124
+ id: "edit-tenant",
125
+ label: K("admin.tenantDetail.nextSteps.edit", "Edit tenant details"),
126
+ description: K("admin.tenantDetail.nextSteps.editDesc", "Update the name, domain or plan for this tenant."),
127
+ onClick: () => L(f(R, `tenants/${Q.id}/edit`)),
128
+ done: !G
129
+ },
130
+ {
131
+ id: "review-members",
132
+ label: K("admin.tenantDetail.nextSteps.members", "Review members"),
133
+ description: K("admin.tenantDetail.nextSteps.membersDesc", "Check who has access inside this tenant."),
134
+ href: "#tenant-members"
135
+ },
136
+ {
137
+ id: "configure-sso",
138
+ label: K("admin.tenantDetail.nextSteps.sso", "Configure SSO"),
139
+ description: K("admin.tenantDetail.nextSteps.ssoDesc", "Set up single sign-on so their team logs in with your IdP."),
140
+ href: "#tenant-sso"
141
+ }
142
+ ]
143
+ }),
144
+ /* @__PURE__ */ E("div", {
145
+ className: "grid gap-6 lg:grid-cols-3",
146
+ children: [/* @__PURE__ */ E("div", {
147
+ className: "space-y-6 lg:col-span-2",
148
+ children: [
149
+ /* @__PURE__ */ T(k, {
150
+ className: "p-0",
151
+ children: /* @__PURE__ */ E(a, {
152
+ className: "border-0 bg-transparent shadow-none hover:border-0",
153
+ children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ T(c, {
154
+ className: "text-lg",
155
+ children: K("admin.tenantDetail.overview.title", "Overview")
156
+ }) }), /* @__PURE__ */ E(o, { children: [
157
+ /* @__PURE__ */ E("div", {
158
+ className: "flex items-start gap-4",
159
+ children: [/* @__PURE__ */ T(r, {
160
+ fallback: Q.name.slice(0, 2).toUpperCase(),
161
+ size: "lg"
162
+ }), /* @__PURE__ */ E("div", {
163
+ className: "flex-1 space-y-4",
164
+ children: [/* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("h2", {
165
+ className: "text-xl font-semibold text-text-primary",
166
+ children: Q.name
167
+ }), /* @__PURE__ */ E("p", {
168
+ className: "text-sm text-text-secondary",
169
+ children: ["@", Q.slug]
170
+ })] }), /* @__PURE__ */ E("div", {
171
+ className: "flex flex-wrap items-center gap-4",
172
+ children: [/* @__PURE__ */ T(te, { status: Q.status }), Q.plan && /* @__PURE__ */ T("span", {
173
+ className: "rounded-md bg-action-primary-bg/10 px-2 py-1 text-xs font-medium text-primary",
174
+ children: Q.plan
175
+ })]
176
+ })]
177
+ })]
178
+ }),
179
+ /* @__PURE__ */ T(ee, { className: "my-6" }),
180
+ /* @__PURE__ */ E("div", {
181
+ className: "grid gap-4 sm:grid-cols-2",
182
+ children: [
183
+ Q.ownerEmail && /* @__PURE__ */ E("div", {
184
+ className: "flex items-center gap-3",
185
+ children: [/* @__PURE__ */ T(C, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
186
+ className: "text-xs text-text-secondary",
187
+ children: K("admin.tenantDetail.overview.ownerEmail", "Owner Email")
188
+ }), /* @__PURE__ */ T("p", {
189
+ className: "text-sm font-medium",
190
+ children: Q.ownerEmail
191
+ })] })]
192
+ }),
193
+ Q.domain && /* @__PURE__ */ E("div", {
194
+ className: "flex items-center gap-3",
195
+ children: [/* @__PURE__ */ T(x, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
196
+ className: "text-xs text-text-secondary",
197
+ children: K("admin.tenantDetail.overview.domain", "Domain")
198
+ }), /* @__PURE__ */ T("p", {
199
+ className: "text-sm font-medium",
200
+ children: Q.domain
201
+ })] })]
202
+ }),
203
+ /* @__PURE__ */ E("div", {
204
+ className: "flex items-center gap-3",
205
+ children: [/* @__PURE__ */ T(b, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
206
+ className: "text-xs text-text-secondary",
207
+ children: K("admin.tenantDetail.overview.created", "Created")
208
+ }), /* @__PURE__ */ T("p", {
209
+ className: "text-sm font-medium",
210
+ children: u(Q.createdAt)
211
+ })] })]
212
+ }),
213
+ /* @__PURE__ */ E("div", {
214
+ className: "flex items-center gap-3",
215
+ children: [/* @__PURE__ */ T(b, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ E("div", { children: [/* @__PURE__ */ T("p", {
216
+ className: "text-xs text-text-secondary",
217
+ children: K("admin.tenantDetail.overview.lastUpdated", "Last Updated")
218
+ }), /* @__PURE__ */ T("p", {
219
+ className: "text-sm font-medium",
220
+ children: u(Q.updatedAt)
221
+ })] })]
222
+ })
223
+ ]
224
+ })
225
+ ] })]
226
+ })
136
227
  }),
137
- /* @__PURE__ */ j(l, { className: "my-6" }),
138
- /* @__PURE__ */ M("div", {
228
+ $.length > 0 && /* @__PURE__ */ E(a, { children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ T(c, {
229
+ className: "text-lg",
230
+ children: K("admin.tenantDetail.workspaces.title", "Workspaces ({{count}})", { count: $.length })
231
+ }) }), /* @__PURE__ */ T(o, { children: /* @__PURE__ */ T("div", {
232
+ className: "space-y-2",
233
+ children: $.map((e) => /* @__PURE__ */ E("div", {
234
+ className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
235
+ children: [/* @__PURE__ */ T("span", {
236
+ className: "text-sm font-medium",
237
+ children: e.name
238
+ }), /* @__PURE__ */ T("span", {
239
+ className: "text-xs text-text-secondary capitalize",
240
+ children: e.status?.toLowerCase()
241
+ })]
242
+ }, e.id))
243
+ }) })] }),
244
+ Q.settings && /* @__PURE__ */ E(a, { children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ T(c, {
245
+ className: "text-lg",
246
+ children: K("admin.tenantDetail.settings.title", "Settings")
247
+ }) }), /* @__PURE__ */ T(o, { children: /* @__PURE__ */ E("div", {
139
248
  className: "grid gap-4 sm:grid-cols-2",
140
249
  children: [
141
- Q.ownerEmail && /* @__PURE__ */ M("div", {
142
- className: "flex items-center gap-3",
143
- children: [/* @__PURE__ */ j(te, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("p", {
144
- className: "text-xs text-text-secondary",
145
- children: U("admin.tenantDetail.overview.ownerEmail", "Owner Email")
146
- }), /* @__PURE__ */ j("p", {
147
- className: "text-sm font-medium",
148
- children: Q.ownerEmail
149
- })] })]
250
+ /* @__PURE__ */ E("div", {
251
+ className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
252
+ children: [/* @__PURE__ */ T("span", {
253
+ className: "text-sm",
254
+ children: K("admin.tenantDetail.settings.allowSignup", "Allow Signup")
255
+ }), /* @__PURE__ */ T("span", {
256
+ className: `text-sm font-medium ${Q.settings?.allowSignup ? "text-status-success-text" : "text-text-secondary"}`,
257
+ children: Q.settings?.allowSignup ? K("admin.tenantDetail.settings.enabled", "Enabled") : K("admin.tenantDetail.settings.disabled", "Disabled")
258
+ })]
150
259
  }),
151
- Q.domain && /* @__PURE__ */ M("div", {
152
- className: "flex items-center gap-3",
153
- children: [/* @__PURE__ */ j(D, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("p", {
154
- className: "text-xs text-text-secondary",
155
- children: U("admin.tenantDetail.overview.domain", "Domain")
156
- }), /* @__PURE__ */ j("p", {
157
- className: "text-sm font-medium",
158
- children: Q.domain
159
- })] })]
260
+ /* @__PURE__ */ E("div", {
261
+ className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
262
+ children: [/* @__PURE__ */ T("span", {
263
+ className: "text-sm",
264
+ children: K("admin.tenantDetail.settings.sso", "SSO")
265
+ }), /* @__PURE__ */ T("span", {
266
+ className: `text-sm font-medium ${Q.settings?.ssoEnabled ? "text-status-success-text" : "text-text-secondary"}`,
267
+ children: Q.settings?.ssoEnabled ? K("admin.tenantDetail.settings.enabled", "Enabled") : K("admin.tenantDetail.settings.disabled", "Disabled")
268
+ })]
160
269
  }),
161
- /* @__PURE__ */ M("div", {
162
- className: "flex items-center gap-3",
163
- children: [/* @__PURE__ */ j(T, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("p", {
164
- className: "text-xs text-text-secondary",
165
- children: U("admin.tenantDetail.overview.created", "Created")
166
- }), /* @__PURE__ */ j("p", {
167
- className: "text-sm font-medium",
168
- children: f(Q.createdAt)
169
- })] })]
270
+ /* @__PURE__ */ E("div", {
271
+ className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
272
+ children: [/* @__PURE__ */ T("span", {
273
+ className: "text-sm",
274
+ children: K("admin.tenantDetail.settings.mfaRequired", "MFA Required")
275
+ }), /* @__PURE__ */ T("span", {
276
+ className: `text-sm font-medium ${Q.settings?.mfaRequired ? "text-status-success-text" : "text-text-secondary"}`,
277
+ children: Q.settings?.mfaRequired ? K("admin.tenantDetail.settings.yes", "Yes") : K("admin.tenantDetail.settings.no", "No")
278
+ })]
170
279
  }),
171
- /* @__PURE__ */ M("div", {
172
- className: "flex items-center gap-3",
173
- children: [/* @__PURE__ */ j(T, { className: "h-4 w-4 text-text-secondary" }), /* @__PURE__ */ M("div", { children: [/* @__PURE__ */ j("p", {
174
- className: "text-xs text-text-secondary",
175
- children: U("admin.tenantDetail.overview.lastUpdated", "Last Updated")
176
- }), /* @__PURE__ */ j("p", {
280
+ /* @__PURE__ */ E("div", {
281
+ className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
282
+ children: [/* @__PURE__ */ T("span", {
283
+ className: "text-sm",
284
+ children: K("admin.tenantDetail.settings.dataRetention", "Data Retention")
285
+ }), /* @__PURE__ */ T("span", {
177
286
  className: "text-sm font-medium",
178
- children: f(Q.updatedAt)
179
- })] })]
287
+ children: K("admin.tenantDetail.settings.dataRetentionDays", "{{days}} days", { days: Q.settings?.dataRetentionDays ?? 0 })
288
+ })]
180
289
  })
181
290
  ]
291
+ }) })] }),
292
+ /* @__PURE__ */ T("div", {
293
+ id: "tenant-sso",
294
+ children: /* @__PURE__ */ T(ie, {
295
+ tenantId: Q.id,
296
+ canManage: G
297
+ })
298
+ }),
299
+ /* @__PURE__ */ T("div", {
300
+ id: "tenant-members",
301
+ children: /* @__PURE__ */ T(re, {
302
+ tenantId: Q.id,
303
+ tenantType: Q.type ?? "",
304
+ canManage: G
305
+ })
182
306
  })
183
- ] })] }),
184
- $.length > 0 && /* @__PURE__ */ M(a, { children: [/* @__PURE__ */ j(s, { children: /* @__PURE__ */ j(c, {
307
+ ]
308
+ }), /* @__PURE__ */ T("div", {
309
+ className: "space-y-6",
310
+ children: /* @__PURE__ */ E(a, { children: [/* @__PURE__ */ T(s, { children: /* @__PURE__ */ T(c, {
185
311
  className: "text-lg",
186
- children: U("admin.tenantDetail.workspaces.title", "Workspaces ({{count}})", { count: $.length })
187
- }) }), /* @__PURE__ */ j(o, { children: /* @__PURE__ */ j("div", {
312
+ children: K("admin.tenantDetail.actions.title", "Actions")
313
+ }) }), /* @__PURE__ */ E(o, {
188
314
  className: "space-y-2",
189
- children: $.map((e) => /* @__PURE__ */ M("div", {
190
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
191
- children: [/* @__PURE__ */ j("span", {
192
- className: "text-sm font-medium",
193
- children: e.name
194
- }), /* @__PURE__ */ j("span", {
195
- className: "text-xs text-text-secondary capitalize",
196
- children: e.status?.toLowerCase()
197
- })]
198
- }, e.id))
199
- }) })] }),
200
- Q.settings && /* @__PURE__ */ M(a, { children: [/* @__PURE__ */ j(s, { children: /* @__PURE__ */ j(c, {
201
- className: "text-lg",
202
- children: U("admin.tenantDetail.settings.title", "Settings")
203
- }) }), /* @__PURE__ */ j(o, { children: /* @__PURE__ */ M("div", {
204
- className: "grid gap-4 sm:grid-cols-2",
205
- children: [
206
- /* @__PURE__ */ M("div", {
207
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
208
- children: [/* @__PURE__ */ j("span", {
209
- className: "text-sm",
210
- children: U("admin.tenantDetail.settings.allowSignup", "Allow Signup")
211
- }), /* @__PURE__ */ j("span", {
212
- className: `text-sm font-medium ${Q.settings?.allowSignup ? "text-success" : "text-text-secondary"}`,
213
- children: Q.settings?.allowSignup ? U("admin.tenantDetail.settings.enabled", "Enabled") : U("admin.tenantDetail.settings.disabled", "Disabled")
214
- })]
215
- }),
216
- /* @__PURE__ */ M("div", {
217
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
218
- children: [/* @__PURE__ */ j("span", {
219
- className: "text-sm",
220
- children: U("admin.tenantDetail.settings.sso", "SSO")
221
- }), /* @__PURE__ */ j("span", {
222
- className: `text-sm font-medium ${Q.settings?.ssoEnabled ? "text-success" : "text-text-secondary"}`,
223
- children: Q.settings?.ssoEnabled ? U("admin.tenantDetail.settings.enabled", "Enabled") : U("admin.tenantDetail.settings.disabled", "Disabled")
224
- })]
225
- }),
226
- /* @__PURE__ */ M("div", {
227
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
228
- children: [/* @__PURE__ */ j("span", {
229
- className: "text-sm",
230
- children: U("admin.tenantDetail.settings.mfaRequired", "MFA Required")
231
- }), /* @__PURE__ */ j("span", {
232
- className: `text-sm font-medium ${Q.settings?.mfaRequired ? "text-success" : "text-text-secondary"}`,
233
- children: Q.settings?.mfaRequired ? U("admin.tenantDetail.settings.yes", "Yes") : U("admin.tenantDetail.settings.no", "No")
234
- })]
235
- }),
236
- /* @__PURE__ */ M("div", {
237
- className: "flex items-center justify-between rounded-lg border border-border-subtle p-3",
238
- children: [/* @__PURE__ */ j("span", {
239
- className: "text-sm",
240
- children: U("admin.tenantDetail.settings.dataRetention", "Data Retention")
241
- }), /* @__PURE__ */ j("span", {
242
- className: "text-sm font-medium",
243
- children: U("admin.tenantDetail.settings.dataRetentionDays", "{{days}} days", { days: Q.settings?.dataRetentionDays ?? 0 })
244
- })]
245
- })
246
- ]
247
- }) })] }),
248
- /* @__PURE__ */ j(x, {
249
- tenantId: Q.id,
250
- canManage: I
251
- }),
252
- /* @__PURE__ */ j(b, {
253
- tenantId: Q.id,
254
- tenantType: Q.type ?? "",
255
- canManage: I
256
- })
257
- ]
258
- }), /* @__PURE__ */ j("div", {
259
- className: "space-y-6",
260
- children: /* @__PURE__ */ M(a, { children: [/* @__PURE__ */ j(s, { children: /* @__PURE__ */ j(c, {
261
- className: "text-lg",
262
- children: U("admin.tenantDetail.actions.title", "Actions")
263
- }) }), /* @__PURE__ */ M(o, {
264
- className: "space-y-2",
265
- children: [/* @__PURE__ */ M(i, {
266
- variant: "outline",
267
- className: "w-full justify-start",
268
- onClick: () => z(m(B, `users?tenantId=${Q.id}`)),
269
- children: [/* @__PURE__ */ j(re, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.actions.viewUsers", "View Users")]
270
- }), /* @__PURE__ */ M(i, {
271
- variant: "outline",
272
- className: "w-full justify-start",
273
- onClick: () => z(m(B, `billing/subscriptions?tenantId=${Q.id}`)),
274
- children: [/* @__PURE__ */ j(w, { className: "mr-2 h-4 w-4" }), U("admin.tenantDetail.actions.viewBilling", "View Billing")]
275
- })]
276
- })] })
277
- })]
278
- })
315
+ children: [/* @__PURE__ */ E(i, {
316
+ variant: "outline",
317
+ className: "w-full justify-start",
318
+ onClick: () => L(f(R, `users?tenantId=${Q.id}`)),
319
+ children: [/* @__PURE__ */ T(ce, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.actions.viewUsers", "View Users")]
320
+ }), /* @__PURE__ */ E(i, {
321
+ variant: "outline",
322
+ className: "w-full justify-start",
323
+ onClick: () => L(f(R, `billing/subscriptions?tenantId=${Q.id}`)),
324
+ children: [/* @__PURE__ */ T(oe, { className: "mr-2 h-4 w-4" }), K("admin.tenantDetail.actions.viewBilling", "View Billing")]
325
+ })]
326
+ })] })
327
+ })]
328
+ })
329
+ ]
279
330
  })
331
+ }) : /* @__PURE__ */ T(l, {
332
+ title: K("admin.tenantDetail.featureDisabledTitle", "Tenant management unavailable"),
333
+ description: K("admin.tenantDetail.featureDisabled", "This feature is currently disabled."),
334
+ children: null
280
335
  });
281
336
  }
282
337
  //#endregion
283
- export { F as TenantDetailPage };
338
+ export { N as TenantDetailPage };
284
339
 
285
340
  //# sourceMappingURL=TenantDetailPage.js.map