@burdenoff/microfe-admin 2026.624.1 → 2026.625.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/components/DataTable.js +5 -5
- package/dist/admin/components/DataTable.js.map +1 -1
- package/dist/admin/components/MetricCard.js +40 -37
- package/dist/admin/components/MetricCard.js.map +1 -1
- package/dist/admin/components/PageLayout.js +28 -22
- package/dist/admin/components/PageLayout.js.map +1 -1
- package/dist/admin/components/ui.js +45 -38
- package/dist/admin/components/ui.js.map +1 -1
- package/dist/admin/pages/AuditLogsPage.js +2 -0
- package/dist/admin/pages/AuditLogsPage.js.map +1 -1
- package/dist/admin/pages/BillingPage.js +51 -43
- package/dist/admin/pages/BillingPage.js.map +1 -1
- package/dist/admin/pages/CommunicationsPage.js +3 -0
- package/dist/admin/pages/CommunicationsPage.js.map +1 -1
- package/dist/admin/pages/ContentPagesPage.js +2 -0
- package/dist/admin/pages/ContentPagesPage.js.map +1 -1
- package/dist/admin/pages/DashboardPage.js +7 -4
- package/dist/admin/pages/DashboardPage.js.map +1 -1
- package/dist/admin/pages/FeatureFlagsPage.js +2 -0
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -1
- package/dist/admin/pages/OrganizationsListPage.js +2 -0
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -1
- package/dist/admin/pages/ProductsPage.js +3 -0
- package/dist/admin/pages/ProductsPage.js.map +1 -1
- package/dist/admin/pages/ReferralsPage.js +4 -0
- package/dist/admin/pages/ReferralsPage.js.map +1 -1
- package/dist/admin/pages/RolesPermissionsPage.js +3 -0
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -1
- package/dist/admin/pages/SREPage.js +4 -0
- package/dist/admin/pages/SREPage.js.map +1 -1
- package/dist/admin/pages/SandboxSettingsPage.js +1 -0
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage.js +139 -127
- package/dist/admin/pages/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SyncFailuresPage.js +3 -0
- package/dist/admin/pages/SyncFailuresPage.js.map +1 -1
- package/dist/admin/pages/TenantsListPage.js +2 -0
- package/dist/admin/pages/TenantsListPage.js.map +1 -1
- package/dist/admin/pages/UsersListPage.js +2 -0
- package/dist/admin/pages/UsersListPage.js.map +1 -1
- package/dist/admin/pages/WaitlistPage.js +2 -0
- package/dist/admin/pages/WaitlistPage.js.map +1 -1
- package/dist/admin/pages/WorkflowsPage.js +3 -0
- package/dist/admin/pages/WorkflowsPage.js.map +1 -1
- package/dist/admin/pages/WorkspacesListPage.js +1 -0
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -1
- package/package.json +2 -2
|
@@ -6,157 +6,165 @@ import { PermissionGuard as d } from "../components/PermissionGuard.js";
|
|
|
6
6
|
import "../components/index.js";
|
|
7
7
|
import { Bell as f, Database as p, Globe as m, Key as h, Settings as g, Shield as _ } from "lucide-react";
|
|
8
8
|
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
9
|
-
import {
|
|
9
|
+
import { EmphasisPanel as b, ShowMore as x } from "@burdenoff/fe-libs/ui";
|
|
10
|
+
import { useI18n as S } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
10
11
|
//#region src/admin/pages/SettingsPage.tsx
|
|
11
|
-
function
|
|
12
|
-
let { canManageSettings:
|
|
12
|
+
function C() {
|
|
13
|
+
let { canManageSettings: C, isLoading: w } = e(), { t: T } = S(), E = (e, t, n) => u(T, e, t, n), D = [
|
|
13
14
|
{
|
|
14
15
|
key: "newTenantSignups",
|
|
15
|
-
label:
|
|
16
|
-
description:
|
|
16
|
+
label: E("admin.settings.notifications.items.newTenantSignups.label", "New tenant signups"),
|
|
17
|
+
description: E("admin.settings.notifications.items.newTenantSignups.description", "Get notified when new tenants register")
|
|
17
18
|
},
|
|
18
19
|
{
|
|
19
20
|
key: "paymentFailures",
|
|
20
|
-
label:
|
|
21
|
-
description:
|
|
21
|
+
label: E("admin.settings.notifications.items.paymentFailures.label", "Payment failures"),
|
|
22
|
+
description: E("admin.settings.notifications.items.paymentFailures.description", "Alert when payments fail")
|
|
22
23
|
},
|
|
23
24
|
{
|
|
24
25
|
key: "criticalTickets",
|
|
25
|
-
label:
|
|
26
|
-
description:
|
|
26
|
+
label: E("admin.settings.notifications.items.criticalTickets.label", "Critical tickets"),
|
|
27
|
+
description: E("admin.settings.notifications.items.criticalTickets.description", "Notify on critical support tickets")
|
|
27
28
|
},
|
|
28
29
|
{
|
|
29
30
|
key: "systemAlerts",
|
|
30
|
-
label:
|
|
31
|
-
description:
|
|
31
|
+
label: E("admin.settings.notifications.items.systemAlerts.label", "System alerts"),
|
|
32
|
+
description: E("admin.settings.notifications.items.systemAlerts.description", "Infrastructure and health alerts")
|
|
32
33
|
}
|
|
33
34
|
];
|
|
34
35
|
return /* @__PURE__ */ v(d, {
|
|
35
|
-
allowed:
|
|
36
|
-
isLoading:
|
|
37
|
-
pageTitle:
|
|
38
|
-
denyMessage:
|
|
36
|
+
allowed: C,
|
|
37
|
+
isLoading: w,
|
|
38
|
+
pageTitle: E("admin.settings.title", "Settings"),
|
|
39
|
+
denyMessage: E("admin.settings.denyMessage", "You don't have permission to manage platform settings."),
|
|
39
40
|
children: /* @__PURE__ */ v(l, {
|
|
40
|
-
title:
|
|
41
|
-
|
|
41
|
+
title: E("admin.settings.title", "Settings"),
|
|
42
|
+
gradientWord: E("admin.settings.title", "Settings"),
|
|
43
|
+
description: E("admin.settings.description", "Configure platform settings and preferences"),
|
|
42
44
|
children: /* @__PURE__ */ y("div", {
|
|
43
45
|
className: "grid gap-6 lg:grid-cols-3",
|
|
44
46
|
children: [/* @__PURE__ */ y("div", {
|
|
45
47
|
className: "space-y-6 lg:col-span-2",
|
|
46
48
|
children: [
|
|
47
|
-
/* @__PURE__ */
|
|
48
|
-
className: "
|
|
49
|
-
children:
|
|
50
|
-
className: "
|
|
51
|
-
children:
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
/* @__PURE__ */ y("div", {
|
|
57
|
-
className: "grid gap-4 sm:grid-cols-2",
|
|
58
|
-
children: [/* @__PURE__ */ y("div", {
|
|
59
|
-
className: "space-y-2",
|
|
60
|
-
children: [/* @__PURE__ */ v("label", {
|
|
61
|
-
className: "text-sm font-medium",
|
|
62
|
-
children: w("admin.settings.general.platformName", "Platform Name")
|
|
63
|
-
}), /* @__PURE__ */ v(s, { defaultValue: "Burdenoff Admin" })]
|
|
64
|
-
}), /* @__PURE__ */ y("div", {
|
|
65
|
-
className: "space-y-2",
|
|
66
|
-
children: [/* @__PURE__ */ v("label", {
|
|
67
|
-
className: "text-sm font-medium",
|
|
68
|
-
children: w("admin.settings.general.supportEmail", "Support Email")
|
|
69
|
-
}), /* @__PURE__ */ v(s, {
|
|
70
|
-
defaultValue: "support@burdenoff.com",
|
|
71
|
-
type: "email"
|
|
72
|
-
})]
|
|
49
|
+
/* @__PURE__ */ v(b, {
|
|
50
|
+
className: "p-0",
|
|
51
|
+
children: /* @__PURE__ */ y(n, {
|
|
52
|
+
className: "border-0 bg-transparent shadow-none hover:border-0",
|
|
53
|
+
children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y("div", {
|
|
54
|
+
className: "flex items-center gap-2",
|
|
55
|
+
children: [/* @__PURE__ */ v(g, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
56
|
+
className: "text-lg",
|
|
57
|
+
children: E("admin.settings.general.title", "General")
|
|
73
58
|
})]
|
|
74
|
-
}),
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
})
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
59
|
+
}), /* @__PURE__ */ v(i, { children: E("admin.settings.general.description", "Basic platform configuration") })] }), /* @__PURE__ */ y(r, {
|
|
60
|
+
className: "space-y-4",
|
|
61
|
+
children: [
|
|
62
|
+
/* @__PURE__ */ y("div", {
|
|
63
|
+
className: "grid gap-4 sm:grid-cols-2",
|
|
64
|
+
children: [/* @__PURE__ */ y("div", {
|
|
65
|
+
className: "space-y-2",
|
|
66
|
+
children: [/* @__PURE__ */ v("label", {
|
|
67
|
+
className: "text-sm font-medium",
|
|
68
|
+
children: E("admin.settings.general.platformName", "Platform Name")
|
|
69
|
+
}), /* @__PURE__ */ v(s, { defaultValue: "Burdenoff Admin" })]
|
|
70
|
+
}), /* @__PURE__ */ y("div", {
|
|
71
|
+
className: "space-y-2",
|
|
72
|
+
children: [/* @__PURE__ */ v("label", {
|
|
73
|
+
className: "text-sm font-medium",
|
|
74
|
+
children: E("admin.settings.general.supportEmail", "Support Email")
|
|
75
|
+
}), /* @__PURE__ */ v(s, {
|
|
76
|
+
defaultValue: "support@burdenoff.com",
|
|
77
|
+
type: "email"
|
|
78
|
+
})]
|
|
79
|
+
})]
|
|
80
|
+
}),
|
|
81
|
+
/* @__PURE__ */ y("div", {
|
|
82
|
+
className: "space-y-2",
|
|
83
|
+
children: [/* @__PURE__ */ v("label", {
|
|
84
|
+
className: "text-sm font-medium",
|
|
85
|
+
children: E("admin.settings.general.defaultTimezone", "Default Timezone")
|
|
86
|
+
}), /* @__PURE__ */ y("select", {
|
|
87
|
+
className: "h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm",
|
|
88
|
+
children: [
|
|
89
|
+
/* @__PURE__ */ v("option", {
|
|
90
|
+
value: "UTC",
|
|
91
|
+
children: "UTC"
|
|
92
|
+
}),
|
|
93
|
+
/* @__PURE__ */ v("option", {
|
|
94
|
+
value: "America/New_York",
|
|
95
|
+
children: E("admin.settings.general.timezones.eastern", "Eastern Time (ET)")
|
|
96
|
+
}),
|
|
97
|
+
/* @__PURE__ */ v("option", {
|
|
98
|
+
value: "America/Los_Angeles",
|
|
99
|
+
children: E("admin.settings.general.timezones.pacific", "Pacific Time (PT)")
|
|
100
|
+
}),
|
|
101
|
+
/* @__PURE__ */ v("option", {
|
|
102
|
+
value: "Europe/London",
|
|
103
|
+
children: E("admin.settings.general.timezones.london", "London (GMT)")
|
|
104
|
+
}),
|
|
105
|
+
/* @__PURE__ */ v("option", {
|
|
106
|
+
value: "Asia/Kolkata",
|
|
107
|
+
children: E("admin.settings.general.timezones.india", "India (IST)")
|
|
108
|
+
})
|
|
109
|
+
]
|
|
110
|
+
})]
|
|
111
|
+
}),
|
|
112
|
+
/* @__PURE__ */ v("div", {
|
|
113
|
+
className: "flex justify-end",
|
|
114
|
+
children: /* @__PURE__ */ v(t, { children: E("admin.settings.general.saveChanges", "Save Changes") })
|
|
115
|
+
})
|
|
116
|
+
]
|
|
117
|
+
})]
|
|
118
|
+
})
|
|
119
|
+
}),
|
|
112
120
|
/* @__PURE__ */ y(n, { children: [/* @__PURE__ */ y(a, { children: [/* @__PURE__ */ y("div", {
|
|
113
121
|
className: "flex items-center gap-2",
|
|
114
122
|
children: [/* @__PURE__ */ v(_, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
115
123
|
className: "text-lg",
|
|
116
|
-
children:
|
|
124
|
+
children: E("admin.settings.security.title", "Security")
|
|
117
125
|
})]
|
|
118
|
-
}), /* @__PURE__ */ v(i, { children:
|
|
126
|
+
}), /* @__PURE__ */ v(i, { children: E("admin.settings.security.description", "Security and authentication settings") })] }), /* @__PURE__ */ y(r, {
|
|
119
127
|
className: "space-y-4",
|
|
120
128
|
children: [
|
|
121
129
|
/* @__PURE__ */ y("div", {
|
|
122
130
|
className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
|
|
123
131
|
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
124
132
|
className: "font-medium",
|
|
125
|
-
children:
|
|
133
|
+
children: E("admin.settings.security.twoFactor.title", "Two-Factor Authentication")
|
|
126
134
|
}), /* @__PURE__ */ v("div", {
|
|
127
135
|
className: "text-sm text-text-secondary",
|
|
128
|
-
children:
|
|
136
|
+
children: E("admin.settings.security.twoFactor.description", "Require 2FA for all admin accounts")
|
|
129
137
|
})] }), /* @__PURE__ */ v(t, {
|
|
130
138
|
variant: "outline",
|
|
131
|
-
children:
|
|
139
|
+
children: E("admin.settings.security.twoFactor.configure", "Configure")
|
|
132
140
|
})]
|
|
133
141
|
}),
|
|
134
142
|
/* @__PURE__ */ y("div", {
|
|
135
143
|
className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
|
|
136
144
|
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
137
145
|
className: "font-medium",
|
|
138
|
-
children:
|
|
146
|
+
children: E("admin.settings.security.sessionTimeout.title", "Session Timeout")
|
|
139
147
|
}), /* @__PURE__ */ v("div", {
|
|
140
148
|
className: "text-sm text-text-secondary",
|
|
141
|
-
children:
|
|
149
|
+
children: E("admin.settings.security.sessionTimeout.description", "Auto-logout after inactivity")
|
|
142
150
|
})] }), /* @__PURE__ */ y("select", {
|
|
143
151
|
className: "h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm",
|
|
144
152
|
children: [
|
|
145
153
|
/* @__PURE__ */ v("option", {
|
|
146
154
|
value: "15",
|
|
147
|
-
children:
|
|
155
|
+
children: E("admin.settings.security.sessionTimeout.options.15m", "15 minutes")
|
|
148
156
|
}),
|
|
149
157
|
/* @__PURE__ */ v("option", {
|
|
150
158
|
value: "30",
|
|
151
|
-
children:
|
|
159
|
+
children: E("admin.settings.security.sessionTimeout.options.30m", "30 minutes")
|
|
152
160
|
}),
|
|
153
161
|
/* @__PURE__ */ v("option", {
|
|
154
162
|
value: "60",
|
|
155
|
-
children:
|
|
163
|
+
children: E("admin.settings.security.sessionTimeout.options.1h", "1 hour")
|
|
156
164
|
}),
|
|
157
165
|
/* @__PURE__ */ v("option", {
|
|
158
166
|
value: "480",
|
|
159
|
-
children:
|
|
167
|
+
children: E("admin.settings.security.sessionTimeout.options.8h", "8 hours")
|
|
160
168
|
})
|
|
161
169
|
]
|
|
162
170
|
})]
|
|
@@ -165,13 +173,13 @@ function x() {
|
|
|
165
173
|
className: "flex items-center justify-between rounded-lg border border-border-subtle p-4",
|
|
166
174
|
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
167
175
|
className: "font-medium",
|
|
168
|
-
children:
|
|
176
|
+
children: E("admin.settings.security.ipAllowlist.title", "IP Allowlist")
|
|
169
177
|
}), /* @__PURE__ */ v("div", {
|
|
170
178
|
className: "text-sm text-text-secondary",
|
|
171
|
-
children:
|
|
179
|
+
children: E("admin.settings.security.ipAllowlist.description", "Restrict access to specific IPs")
|
|
172
180
|
})] }), /* @__PURE__ */ v(t, {
|
|
173
181
|
variant: "outline",
|
|
174
|
-
children:
|
|
182
|
+
children: E("admin.settings.security.ipAllowlist.manage", "Manage")
|
|
175
183
|
})]
|
|
176
184
|
})
|
|
177
185
|
]
|
|
@@ -180,28 +188,32 @@ function x() {
|
|
|
180
188
|
className: "flex items-center gap-2",
|
|
181
189
|
children: [/* @__PURE__ */ v(f, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
182
190
|
className: "text-lg",
|
|
183
|
-
children:
|
|
191
|
+
children: E("admin.settings.notifications.title", "Notifications")
|
|
184
192
|
})]
|
|
185
|
-
}), /* @__PURE__ */ v(i, { children:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
193
|
+
}), /* @__PURE__ */ v(i, { children: E("admin.settings.notifications.description", "Configure notification preferences") })] }), /* @__PURE__ */ v(r, { children: /* @__PURE__ */ v(x, {
|
|
194
|
+
collapsedHeight: 180,
|
|
195
|
+
label: "More notification settings",
|
|
196
|
+
children: /* @__PURE__ */ v("div", {
|
|
197
|
+
className: "space-y-4",
|
|
198
|
+
children: D.map((e) => /* @__PURE__ */ y("div", {
|
|
199
|
+
className: "flex items-center justify-between rounded-lg border border-border-seam p-4",
|
|
200
|
+
children: [/* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("div", {
|
|
201
|
+
className: "font-medium",
|
|
202
|
+
children: e.label
|
|
203
|
+
}), /* @__PURE__ */ v("div", {
|
|
204
|
+
className: "text-sm text-text-secondary",
|
|
205
|
+
children: e.description
|
|
206
|
+
})] }), /* @__PURE__ */ y("label", {
|
|
207
|
+
className: "relative inline-flex cursor-pointer items-center",
|
|
208
|
+
children: [/* @__PURE__ */ v("input", {
|
|
209
|
+
type: "checkbox",
|
|
210
|
+
defaultChecked: !0,
|
|
211
|
+
className: "peer sr-only"
|
|
212
|
+
}), /* @__PURE__ */ v("div", { className: "peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]" })]
|
|
213
|
+
})]
|
|
214
|
+
}, e.key))
|
|
215
|
+
})
|
|
216
|
+
}) })] })
|
|
205
217
|
]
|
|
206
218
|
}), /* @__PURE__ */ y("div", {
|
|
207
219
|
className: "space-y-6",
|
|
@@ -210,41 +222,41 @@ function x() {
|
|
|
210
222
|
className: "flex items-center gap-2",
|
|
211
223
|
children: [/* @__PURE__ */ v(h, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
212
224
|
className: "text-lg",
|
|
213
|
-
children:
|
|
225
|
+
children: E("admin.settings.apiKeys.title", "API Keys")
|
|
214
226
|
})]
|
|
215
227
|
}) }), /* @__PURE__ */ y(r, {
|
|
216
228
|
className: "space-y-3",
|
|
217
229
|
children: [/* @__PURE__ */ v("p", {
|
|
218
230
|
className: "text-sm text-text-secondary",
|
|
219
|
-
children:
|
|
231
|
+
children: E("admin.settings.apiKeys.description", "Manage API keys for programmatic access to the admin API.")
|
|
220
232
|
}), /* @__PURE__ */ v(t, {
|
|
221
233
|
variant: "outline",
|
|
222
234
|
className: "w-full",
|
|
223
|
-
children:
|
|
235
|
+
children: E("admin.settings.apiKeys.manage", "Manage API Keys")
|
|
224
236
|
})]
|
|
225
237
|
})] }),
|
|
226
238
|
/* @__PURE__ */ y(n, { children: [/* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
|
|
227
239
|
className: "flex items-center gap-2",
|
|
228
240
|
children: [/* @__PURE__ */ v(m, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
229
241
|
className: "text-lg",
|
|
230
|
-
children:
|
|
242
|
+
children: E("admin.settings.integrations.title", "Integrations")
|
|
231
243
|
})]
|
|
232
244
|
}) }), /* @__PURE__ */ y(r, {
|
|
233
245
|
className: "space-y-3",
|
|
234
246
|
children: [/* @__PURE__ */ v("p", {
|
|
235
247
|
className: "text-sm text-text-secondary",
|
|
236
|
-
children:
|
|
248
|
+
children: E("admin.settings.integrations.description", "Connect third-party services and tools.")
|
|
237
249
|
}), /* @__PURE__ */ v(t, {
|
|
238
250
|
variant: "outline",
|
|
239
251
|
className: "w-full",
|
|
240
|
-
children:
|
|
252
|
+
children: E("admin.settings.integrations.view", "View Integrations")
|
|
241
253
|
})]
|
|
242
254
|
})] }),
|
|
243
255
|
/* @__PURE__ */ y(n, { children: [/* @__PURE__ */ v(a, { children: /* @__PURE__ */ y("div", {
|
|
244
256
|
className: "flex items-center gap-2",
|
|
245
257
|
children: [/* @__PURE__ */ v(p, { className: "h-5 w-5 text-text-secondary" }), /* @__PURE__ */ v(o, {
|
|
246
258
|
className: "text-lg",
|
|
247
|
-
children:
|
|
259
|
+
children: E("admin.settings.data.title", "Data")
|
|
248
260
|
})]
|
|
249
261
|
}) }), /* @__PURE__ */ y(r, {
|
|
250
262
|
className: "space-y-3",
|
|
@@ -252,18 +264,18 @@ function x() {
|
|
|
252
264
|
/* @__PURE__ */ v(t, {
|
|
253
265
|
variant: "outline",
|
|
254
266
|
className: "w-full justify-start",
|
|
255
|
-
children:
|
|
267
|
+
children: E("admin.settings.data.export", "Export Data")
|
|
256
268
|
}),
|
|
257
269
|
/* @__PURE__ */ v(t, {
|
|
258
270
|
variant: "outline",
|
|
259
271
|
className: "w-full justify-start",
|
|
260
|
-
children:
|
|
272
|
+
children: E("admin.settings.data.auditLogs", "Audit Logs")
|
|
261
273
|
}),
|
|
262
274
|
/* @__PURE__ */ v(c, {}),
|
|
263
275
|
/* @__PURE__ */ v(t, {
|
|
264
276
|
variant: "outline",
|
|
265
277
|
className: "w-full justify-start text-status-error-text",
|
|
266
|
-
children:
|
|
278
|
+
children: E("admin.settings.data.dangerZone", "Danger Zone")
|
|
267
279
|
})
|
|
268
280
|
]
|
|
269
281
|
})] })
|
|
@@ -274,6 +286,6 @@ function x() {
|
|
|
274
286
|
});
|
|
275
287
|
}
|
|
276
288
|
//#endregion
|
|
277
|
-
export {
|
|
289
|
+
export { C as SettingsPage };
|
|
278
290
|
|
|
279
291
|
//# sourceMappingURL=SettingsPage.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, ShowMore } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n gradientWord={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General — primary settings zone (emphasis) */}\n <EmphasisPanel className=\"p-0\">\n <Card className=\"border-0 bg-transparent shadow-none hover:border-0\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n </EmphasisPanel>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ShowMore collapsedHeight={180} label=\"More notification settings\">\n <div className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </div>\n </ShowMore>\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -162,6 +162,7 @@ function N() {
|
|
|
162
162
|
denyMessage: "Only super-admins can view cross-layer sync failures.",
|
|
163
163
|
children: /* @__PURE__ */ E(s, {
|
|
164
164
|
title: "Sync Failures",
|
|
165
|
+
gradientWord: "Failures",
|
|
165
166
|
description: "Cross-layer sync operations (global → workspace) that did not complete. Automatic retries run in the background; use the manual retry once the underlying issue is fixed.",
|
|
166
167
|
actions: /* @__PURE__ */ E(r, {
|
|
167
168
|
variant: "outline",
|
|
@@ -175,6 +176,7 @@ function N() {
|
|
|
175
176
|
/* @__PURE__ */ E(d, { children: [
|
|
176
177
|
/* @__PURE__ */ T(u, {
|
|
177
178
|
title: "Pending",
|
|
179
|
+
hero: !0,
|
|
178
180
|
value: $?.pending ?? 0,
|
|
179
181
|
icon: /* @__PURE__ */ T(re, { className: "h-5 w-5" }),
|
|
180
182
|
subtitle: "Waiting for first retry",
|
|
@@ -231,6 +233,7 @@ function N() {
|
|
|
231
233
|
loading: U,
|
|
232
234
|
onRowClick: (e) => z((t) => t === e.id ? null : e.id),
|
|
233
235
|
emptyState: /* @__PURE__ */ T(o, {
|
|
236
|
+
illustration: "empty-data",
|
|
234
237
|
icon: /* @__PURE__ */ T(x, { className: "h-8 w-8" }),
|
|
235
238
|
title: "No sync failures",
|
|
236
239
|
description: P === "PERMANENTLY_FAILED" ? "Nothing has exhausted automatic retries." : "No outbox entries match the current filter."
|