@alepha/ui 0.16.2 → 0.17.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/{AdminApiKeys-CoTOTfgU.js → AdminApiKeys-CF_qOO3u.js} +20 -20
- package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +1 -0
- package/dist/admin/{AdminAudits-BmsxFbDa.js → AdminAudits-BQno3hZG.js} +7 -8
- package/dist/admin/AdminAudits-BQno3hZG.js.map +1 -0
- package/dist/admin/{AdminFiles-BBB8knca.js → AdminFiles-kvuUaASF.js} +3 -5
- package/dist/admin/{AdminFiles-BBB8knca.js.map → AdminFiles-kvuUaASF.js.map} +1 -1
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js +485 -0
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +1 -0
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js +678 -0
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +1 -0
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js +301 -0
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +1 -0
- package/dist/admin/{AdminLayout-CsjvpeD1.js → AdminLayout-e-ZP5nWw.js} +1 -1
- package/dist/admin/{AdminLayout-CsjvpeD1.js.map → AdminLayout-e-ZP5nWw.js.map} +1 -1
- package/dist/admin/{AdminNotifications-LwR6RKrx.js → AdminNotifications-DeHJFf6W.js} +3 -5
- package/dist/admin/{AdminNotifications-LwR6RKrx.js.map → AdminNotifications-DeHJFf6W.js.map} +1 -1
- package/dist/admin/{AdminParameters-B_83Vie9.js → AdminParameters-iQE8o7a7.js} +43 -36
- package/dist/admin/AdminParameters-iQE8o7a7.js.map +1 -0
- package/dist/admin/{AdminSessions-CWnPosdd.js → AdminSessions-oKJCbd7w.js} +5 -7
- package/dist/admin/AdminSessions-oKJCbd7w.js.map +1 -0
- package/dist/admin/{AdminUserAudits-nHv636E_.js → AdminUserAudits-BNCEle_E.js} +6 -8
- package/dist/admin/AdminUserAudits-BNCEle_E.js.map +1 -0
- package/dist/admin/{AdminUserCreate-CjYD3Kjc.js → AdminUserCreate-CgqeFwCt.js} +6 -7
- package/dist/admin/AdminUserCreate-CgqeFwCt.js.map +1 -0
- package/dist/admin/{AdminUserDetails-Ccq-LsZ0.js → AdminUserDetails-DDe1A1GP.js} +30 -29
- package/dist/admin/AdminUserDetails-DDe1A1GP.js.map +1 -0
- package/dist/admin/{AdminUserLayout-7s41DiF_.js → AdminUserLayout-HAlobhWf.js} +18 -16
- package/dist/admin/AdminUserLayout-HAlobhWf.js.map +1 -0
- package/dist/admin/{AdminUserSessions-Ds3ODq_d.js → AdminUserSessions-Bq1LnVLf.js} +5 -7
- package/dist/admin/AdminUserSessions-Bq1LnVLf.js.map +1 -0
- package/dist/admin/{AdminUserSettings-CGh4gROo.js → AdminUserSettings-BRsBZoxV.js} +10 -10
- package/dist/admin/AdminUserSettings-BRsBZoxV.js.map +1 -0
- package/dist/admin/{AdminUsers-CvPiBzQK.js → AdminUsers-D71kIOSn.js} +6 -8
- package/dist/admin/AdminUsers-D71kIOSn.js.map +1 -0
- package/dist/admin/index.d.ts +7 -83
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +49 -70
- package/dist/admin/index.js.map +1 -1
- package/dist/auth/{Login-DS_OqA0G.js → Login-BS_FYTy0.js} +13 -8
- package/dist/auth/Login-BS_FYTy0.js.map +1 -0
- package/dist/auth/{Profile-Di7N7HZL.js → Profile-CjDsW378.js} +16 -10
- package/dist/auth/Profile-CjDsW378.js.map +1 -0
- package/dist/auth/{Register-BRR2_gux.js → Register-C5eqzAaD.js} +21 -12
- package/dist/auth/Register-C5eqzAaD.js.map +1 -0
- package/dist/auth/{ResetPassword-oQu72lod.js → ResetPassword-XifinVao.js} +14 -8
- package/dist/auth/ResetPassword-XifinVao.js.map +1 -0
- package/dist/auth/{VerifyEmail-DC6HPZjd.js → VerifyEmail-DTgbeJOO.js} +6 -4
- package/dist/auth/VerifyEmail-DTgbeJOO.js.map +1 -0
- package/dist/auth/index.d.ts +4 -0
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +15 -14
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +37 -26
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +444 -193
- package/dist/core/index.js.map +1 -1
- package/dist/demo/DemoDataTable-lnBKWBf8.js +362 -0
- package/dist/demo/DemoDataTable-lnBKWBf8.js.map +1 -0
- package/dist/demo/{DemoHome-DpRrPlBC.js → DemoHome-CUMZsYaH.js} +6 -7
- package/dist/demo/DemoHome-CUMZsYaH.js.map +1 -0
- package/dist/demo/{DemoJsonViewer-zeucGKHV.js → DemoJsonViewer-_uokbGaW.js} +17 -19
- package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +1 -0
- package/dist/demo/{DemoLayout-PhgbAAiQ.js → DemoLayout-DHVoacE6.js} +2 -4
- package/dist/demo/{DemoLayout-PhgbAAiQ.js.map → DemoLayout-DHVoacE6.js.map} +1 -1
- package/dist/demo/{DemoLogin-DSzP0Lkv.js → DemoLogin-DjJ9314c.js} +22 -17
- package/dist/demo/DemoLogin-DjJ9314c.js.map +1 -0
- package/dist/demo/{DemoRegister-DavFBsCz.js → DemoRegister-DzkJ5M83.js} +34 -25
- package/dist/demo/DemoRegister-DzkJ5M83.js.map +1 -0
- package/dist/demo/{DemoResetPassword-BS2rIAQK.js → DemoResetPassword-DWh4_BpQ.js} +27 -21
- package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +1 -0
- package/dist/demo/{DemoSidebar-zNkUmHRl.js → DemoSidebar-C1csnGhX.js} +2 -2
- package/dist/demo/{DemoSidebar-zNkUmHRl.js.map → DemoSidebar-C1csnGhX.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-B9q7oT0b.js → DemoTypeForm-CWz6fJrJ.js} +2 -2
- package/dist/demo/{DemoTypeForm-B9q7oT0b.js.map → DemoTypeForm-CWz6fJrJ.js.map} +1 -1
- package/dist/demo/{DemoVerifyEmail-Bi4SdWz0.js → DemoVerifyEmail-DbU_tCj8.js} +13 -11
- package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +1 -0
- package/dist/demo/{IconGoogle-CTeZyrek.js → IconGoogle-Ch1m3Uzl.js} +1 -1
- package/dist/demo/{IconGoogle-CTeZyrek.js.map → IconGoogle-Ch1m3Uzl.js.map} +1 -1
- package/dist/demo/{Showcase-C9btr_SJ.js → Showcase-BzoXNlCn.js} +10 -10
- package/dist/demo/Showcase-BzoXNlCn.js.map +1 -0
- package/dist/demo/index.d.ts +1 -68
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +11 -15
- package/dist/demo/index.js.map +1 -1
- package/dist/json/index.js +2 -2
- package/dist/json/index.js.map +1 -1
- package/package.json +9 -5
- package/src/admin/AdminRouter.ts +36 -5
- package/src/admin/components/audits/AdminAudits.tsx +5 -5
- package/src/admin/components/jobs/AdminJobDashboard.tsx +455 -0
- package/src/admin/components/jobs/AdminJobExecutions.tsx +693 -0
- package/src/admin/components/jobs/AdminJobRegistry.tsx +325 -0
- package/src/admin/components/keys/AdminApiKeys.tsx +28 -31
- package/src/admin/components/parameters/AdminParameters.tsx +3 -3
- package/src/admin/components/parameters/ParameterDetails.tsx +34 -29
- package/src/admin/components/parameters/ParameterEmptyState.tsx +5 -5
- package/src/admin/components/parameters/ParameterHistory.tsx +11 -19
- package/src/admin/components/parameters/ParameterTree.tsx +16 -18
- package/src/admin/components/sessions/AdminSessions.tsx +3 -3
- package/src/admin/components/shared/AdminResourceHeader.tsx +20 -16
- package/src/admin/components/users/AdminUserAudits.tsx +5 -5
- package/src/admin/components/users/AdminUserCreate.tsx +3 -3
- package/src/admin/components/users/AdminUserDetails.tsx +51 -53
- package/src/admin/components/users/AdminUserLayout.tsx +7 -7
- package/src/admin/components/users/AdminUserSessions.tsx +3 -3
- package/src/admin/components/users/AdminUserSettings.tsx +9 -9
- package/src/admin/components/users/AdminUsers.tsx +5 -5
- package/src/admin/components/verifications/AdminVerifications.tsx +3 -3
- package/src/admin/index.ts +0 -24
- package/src/auth/components/Login.tsx +13 -13
- package/src/auth/components/Profile.tsx +17 -26
- package/src/auth/components/Register.tsx +21 -31
- package/src/auth/components/ResetPassword.tsx +13 -22
- package/src/auth/components/VerifyEmail.tsx +5 -5
- package/src/auth/components/buttons/UserButton.tsx +14 -4
- package/src/core/components/buttons/ActionButton.tsx +9 -2
- package/src/core/components/data/ErrorViewer.tsx +15 -15
- package/src/core/components/dialogs/AlertDialog.tsx +3 -3
- package/src/core/components/dialogs/ConfirmDialog.tsx +3 -3
- package/src/core/components/dialogs/PromptDialog.tsx +3 -3
- package/src/core/components/form/Control.tsx +9 -0
- package/src/core/components/form/ControlArray.tsx +6 -7
- package/src/core/components/form/ControlObject.tsx +3 -3
- package/src/core/components/form/ControlQueryBuilder.tsx +20 -22
- package/src/core/components/form/ControlSelect.tsx +4 -0
- package/src/core/components/form/TypeForm.tsx +7 -0
- package/src/core/components/layout/Breadcrumb.tsx +6 -6
- package/src/core/components/layout/Omnibar.tsx +2 -1
- package/src/core/components/layout/Sidebar.tsx +5 -1
- package/src/core/components/table/ColumnPicker.tsx +47 -31
- package/src/core/components/table/DataTable.tsx +277 -201
- package/src/core/components/table/DataTableFilters.tsx +8 -0
- package/src/core/components/table/DataTableToolbar.tsx +98 -5
- package/src/core/components/table/FilterPicker.tsx +28 -26
- package/src/core/components/table/types.ts +52 -37
- package/src/core/components/table/useTableSelection.ts +83 -0
- package/src/core/styles.css +1 -0
- package/src/core/utils/parseInput.ts +1 -0
- package/src/demo/components/DemoHome.tsx +5 -5
- package/src/demo/components/core/DemoDataTable.tsx +209 -5
- package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
- package/src/demo/components/shared/MacWindow.tsx +7 -7
- package/src/demo/components/shared/Showcase.tsx +3 -3
- package/src/demo/index.ts +0 -11
- package/src/json/components/JsonViewer.tsx +3 -3
- package/dist/admin/AdminApiKeys-CoTOTfgU.js.map +0 -1
- package/dist/admin/AdminAudits-BmsxFbDa.js.map +0 -1
- package/dist/admin/AdminJobs-C604joTz.js +0 -698
- package/dist/admin/AdminJobs-C604joTz.js.map +0 -1
- package/dist/admin/AdminParameters-B_83Vie9.js.map +0 -1
- package/dist/admin/AdminSessions-CWnPosdd.js.map +0 -1
- package/dist/admin/AdminUserAudits-nHv636E_.js.map +0 -1
- package/dist/admin/AdminUserCreate-CjYD3Kjc.js.map +0 -1
- package/dist/admin/AdminUserDetails-Ccq-LsZ0.js.map +0 -1
- package/dist/admin/AdminUserLayout-7s41DiF_.js.map +0 -1
- package/dist/admin/AdminUserSessions-Ds3ODq_d.js.map +0 -1
- package/dist/admin/AdminUserSettings-CGh4gROo.js.map +0 -1
- package/dist/admin/AdminUsers-CvPiBzQK.js.map +0 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/auth/Login-DS_OqA0G.js.map +0 -1
- package/dist/auth/Profile-Di7N7HZL.js.map +0 -1
- package/dist/auth/Register-BRR2_gux.js.map +0 -1
- package/dist/auth/ResetPassword-oQu72lod.js.map +0 -1
- package/dist/auth/VerifyEmail-DC6HPZjd.js.map +0 -1
- package/dist/demo/DemoDataTable-DCsJq8v5.js +0 -149
- package/dist/demo/DemoDataTable-DCsJq8v5.js.map +0 -1
- package/dist/demo/DemoHome-DpRrPlBC.js.map +0 -1
- package/dist/demo/DemoJsonViewer-zeucGKHV.js.map +0 -1
- package/dist/demo/DemoLogin-DSzP0Lkv.js.map +0 -1
- package/dist/demo/DemoRegister-DavFBsCz.js.map +0 -1
- package/dist/demo/DemoResetPassword-BS2rIAQK.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-Bi4SdWz0.js.map +0 -1
- package/dist/demo/Showcase-C9btr_SJ.js.map +0 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
- package/src/admin/components/jobs/AdminJobs.tsx +0 -772
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import { ActionButton, ClipboardButton, Control } from "@alepha/ui";
|
|
2
2
|
import {
|
|
3
3
|
Badge,
|
|
4
|
-
Box,
|
|
5
4
|
Card,
|
|
6
5
|
Center,
|
|
7
6
|
Divider,
|
|
7
|
+
Flex,
|
|
8
8
|
Grid,
|
|
9
|
-
Group,
|
|
10
9
|
Loader,
|
|
11
10
|
Paper,
|
|
12
11
|
SimpleGrid,
|
|
13
|
-
Stack,
|
|
14
12
|
Text,
|
|
15
13
|
ThemeIcon,
|
|
16
14
|
} from "@mantine/core";
|
|
@@ -43,7 +41,7 @@ interface DataRowProps {
|
|
|
43
41
|
}
|
|
44
42
|
|
|
45
43
|
const DataRow = ({ label, value, copyValue }: DataRowProps) => (
|
|
46
|
-
<
|
|
44
|
+
<Flex
|
|
47
45
|
justify="space-between"
|
|
48
46
|
py={8}
|
|
49
47
|
wrap="nowrap"
|
|
@@ -52,7 +50,7 @@ const DataRow = ({ label, value, copyValue }: DataRowProps) => (
|
|
|
52
50
|
<Text size="sm" c="dimmed" style={{ flexShrink: 0 }}>
|
|
53
51
|
{label}
|
|
54
52
|
</Text>
|
|
55
|
-
<
|
|
53
|
+
<Flex gap={6} wrap="nowrap" style={{ minWidth: 0 }}>
|
|
56
54
|
{typeof value === "string" ? (
|
|
57
55
|
<Text size="sm" fw={500} truncate style={{ maxWidth: 220 }}>
|
|
58
56
|
{value || "—"}
|
|
@@ -68,8 +66,8 @@ const DataRow = ({ label, value, copyValue }: DataRowProps) => (
|
|
|
68
66
|
c="dimmed"
|
|
69
67
|
/>
|
|
70
68
|
)}
|
|
71
|
-
</
|
|
72
|
-
</
|
|
69
|
+
</Flex>
|
|
70
|
+
</Flex>
|
|
73
71
|
);
|
|
74
72
|
|
|
75
73
|
interface StatCardProps {
|
|
@@ -81,19 +79,19 @@ interface StatCardProps {
|
|
|
81
79
|
|
|
82
80
|
const StatCard = ({ icon, label, value, color }: StatCardProps) => (
|
|
83
81
|
<Paper p="md" radius="md" withBorder>
|
|
84
|
-
<
|
|
82
|
+
<Flex gap="sm">
|
|
85
83
|
<ThemeIcon size="lg" radius="md" variant="light" color={color}>
|
|
86
84
|
{icon}
|
|
87
85
|
</ThemeIcon>
|
|
88
|
-
<
|
|
86
|
+
<Flex>
|
|
89
87
|
<Text size="xl" fw={700} lh={1}>
|
|
90
88
|
{value}
|
|
91
89
|
</Text>
|
|
92
90
|
<Text size="xs" c="dimmed">
|
|
93
91
|
{label}
|
|
94
92
|
</Text>
|
|
95
|
-
</
|
|
96
|
-
</
|
|
93
|
+
</Flex>
|
|
94
|
+
</Flex>
|
|
97
95
|
</Paper>
|
|
98
96
|
);
|
|
99
97
|
|
|
@@ -165,10 +163,10 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
165
163
|
if (!user) {
|
|
166
164
|
return (
|
|
167
165
|
<Center flex={1} py="xl">
|
|
168
|
-
<
|
|
166
|
+
<Flex direction="column" align="center" gap="xs">
|
|
169
167
|
<IconUser size={48} opacity={0.3} />
|
|
170
168
|
<Text c="dimmed">User not found</Text>
|
|
171
|
-
</
|
|
169
|
+
</Flex>
|
|
172
170
|
</Center>
|
|
173
171
|
);
|
|
174
172
|
}
|
|
@@ -179,7 +177,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
179
177
|
: user.firstName || user.lastName || null;
|
|
180
178
|
|
|
181
179
|
return (
|
|
182
|
-
<
|
|
180
|
+
<Flex direction="column" gap="md">
|
|
183
181
|
{/* Stats Overview */}
|
|
184
182
|
<SimpleGrid cols={{ base: 2, sm: 4 }}>
|
|
185
183
|
<StatCard
|
|
@@ -212,12 +210,12 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
212
210
|
{/* Left Column - Account Details */}
|
|
213
211
|
<Grid.Col span={{ base: 12, md: 6 }}>
|
|
214
212
|
<Card padding={0} radius="md" withBorder h="100%">
|
|
215
|
-
<
|
|
213
|
+
<Flex justify="space-between" p="md" pb={0}>
|
|
216
214
|
<Text fw={600} size="sm">
|
|
217
215
|
Account Details
|
|
218
216
|
</Text>
|
|
219
|
-
</
|
|
220
|
-
<
|
|
217
|
+
</Flex>
|
|
218
|
+
<Flex px="md" pb="md">
|
|
221
219
|
<DataRow label="User ID" value={user.id} copyValue={user.id} />
|
|
222
220
|
<DataRow
|
|
223
221
|
label="Username"
|
|
@@ -227,7 +225,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
227
225
|
<DataRow
|
|
228
226
|
label="Email"
|
|
229
227
|
value={
|
|
230
|
-
<
|
|
228
|
+
<Flex gap={6}>
|
|
231
229
|
<Text size="sm" fw={500}>
|
|
232
230
|
{user.email || "—"}
|
|
233
231
|
</Text>
|
|
@@ -240,7 +238,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
240
238
|
{user.emailVerified ? "verified" : "unverified"}
|
|
241
239
|
</Badge>
|
|
242
240
|
)}
|
|
243
|
-
</
|
|
241
|
+
</Flex>
|
|
244
242
|
}
|
|
245
243
|
copyValue={user.email}
|
|
246
244
|
/>
|
|
@@ -253,7 +251,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
253
251
|
<DataRow
|
|
254
252
|
label="Status"
|
|
255
253
|
value={
|
|
256
|
-
<
|
|
254
|
+
<Flex gap={4}>
|
|
257
255
|
<ThemeIcon
|
|
258
256
|
size={16}
|
|
259
257
|
radius="xl"
|
|
@@ -269,17 +267,17 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
269
267
|
<Text size="sm" fw={500}>
|
|
270
268
|
{user.enabled ? "Active" : "Disabled"}
|
|
271
269
|
</Text>
|
|
272
|
-
</
|
|
270
|
+
</Flex>
|
|
273
271
|
}
|
|
274
272
|
/>
|
|
275
|
-
</
|
|
273
|
+
</Flex>
|
|
276
274
|
</Card>
|
|
277
275
|
</Grid.Col>
|
|
278
276
|
|
|
279
277
|
{/* Right Column - Personal Info */}
|
|
280
278
|
<Grid.Col span={{ base: 12, md: 6 }}>
|
|
281
279
|
<Card padding={0} radius="md" withBorder h="100%">
|
|
282
|
-
<
|
|
280
|
+
<Flex justify="space-between" p="md" pb={0}>
|
|
283
281
|
<Text fw={600} size="sm">
|
|
284
282
|
Personal Information
|
|
285
283
|
</Text>
|
|
@@ -292,12 +290,12 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
292
290
|
Edit
|
|
293
291
|
</ActionButton>
|
|
294
292
|
)}
|
|
295
|
-
</
|
|
293
|
+
</Flex>
|
|
296
294
|
|
|
297
295
|
{editing ? (
|
|
298
|
-
<
|
|
296
|
+
<Flex p="md">
|
|
299
297
|
<form {...form.props}>
|
|
300
|
-
<
|
|
298
|
+
<Flex direction="column" gap="sm">
|
|
301
299
|
<SimpleGrid cols={2}>
|
|
302
300
|
<Control
|
|
303
301
|
title="First Name"
|
|
@@ -311,7 +309,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
311
309
|
</SimpleGrid>
|
|
312
310
|
<Control title="Roles" input={form.input.roles} />
|
|
313
311
|
<Divider />
|
|
314
|
-
<
|
|
312
|
+
<Flex justify="flex-end" gap="xs">
|
|
315
313
|
<ActionButton
|
|
316
314
|
variant="subtle"
|
|
317
315
|
size="xs"
|
|
@@ -322,12 +320,12 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
322
320
|
<ActionButton size="xs" form={form}>
|
|
323
321
|
Save
|
|
324
322
|
</ActionButton>
|
|
325
|
-
</
|
|
326
|
-
</
|
|
323
|
+
</Flex>
|
|
324
|
+
</Flex>
|
|
327
325
|
</form>
|
|
328
|
-
</
|
|
326
|
+
</Flex>
|
|
329
327
|
) : (
|
|
330
|
-
<
|
|
328
|
+
<Flex px="md" pb="md">
|
|
331
329
|
<DataRow label="First Name" value={user.firstName || "—"} />
|
|
332
330
|
<DataRow label="Last Name" value={user.lastName || "—"} />
|
|
333
331
|
<DataRow label="Display Name" value={displayName || "—"} />
|
|
@@ -335,13 +333,13 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
335
333
|
label="Roles"
|
|
336
334
|
value={
|
|
337
335
|
user.roles.length > 0 ? (
|
|
338
|
-
<
|
|
336
|
+
<Flex gap={4}>
|
|
339
337
|
{user.roles.map((role) => (
|
|
340
338
|
<Badge key={role} size="xs" variant="light">
|
|
341
339
|
{role}
|
|
342
340
|
</Badge>
|
|
343
341
|
))}
|
|
344
|
-
</
|
|
342
|
+
</Flex>
|
|
345
343
|
) : (
|
|
346
344
|
<Text size="sm" c="dimmed">
|
|
347
345
|
No roles
|
|
@@ -349,7 +347,7 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
349
347
|
)
|
|
350
348
|
}
|
|
351
349
|
/>
|
|
352
|
-
</
|
|
350
|
+
</Flex>
|
|
353
351
|
)}
|
|
354
352
|
</Card>
|
|
355
353
|
</Grid.Col>
|
|
@@ -357,58 +355,58 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
357
355
|
|
|
358
356
|
{/* Timeline */}
|
|
359
357
|
<Card padding={0} radius="md" withBorder>
|
|
360
|
-
<
|
|
358
|
+
<Flex justify="space-between" p="md" pb={0}>
|
|
361
359
|
<Text fw={600} size="sm">
|
|
362
360
|
Activity Timeline
|
|
363
361
|
</Text>
|
|
364
|
-
</
|
|
362
|
+
</Flex>
|
|
365
363
|
<SimpleGrid cols={{ base: 2, sm: 4 }} p="md">
|
|
366
|
-
<
|
|
367
|
-
<
|
|
364
|
+
<Flex>
|
|
365
|
+
<Flex gap={6} mb={4}>
|
|
368
366
|
<IconCalendar size={14} style={{ opacity: 0.5 }} />
|
|
369
367
|
<Text size="xs" c="dimmed">
|
|
370
368
|
Created
|
|
371
369
|
</Text>
|
|
372
|
-
</
|
|
370
|
+
</Flex>
|
|
373
371
|
<Text size="sm" fw={500}>
|
|
374
372
|
{l(user.createdAt, { date: "ll" })}
|
|
375
373
|
</Text>
|
|
376
374
|
<Text size="xs" c="dimmed">
|
|
377
375
|
{l(user.createdAt, { date: "fromNow" })}
|
|
378
376
|
</Text>
|
|
379
|
-
</
|
|
380
|
-
<
|
|
381
|
-
<
|
|
377
|
+
</Flex>
|
|
378
|
+
<Flex>
|
|
379
|
+
<Flex gap={6} mb={4}>
|
|
382
380
|
<IconCalendar size={14} style={{ opacity: 0.5 }} />
|
|
383
381
|
<Text size="xs" c="dimmed">
|
|
384
382
|
Updated
|
|
385
383
|
</Text>
|
|
386
|
-
</
|
|
384
|
+
</Flex>
|
|
387
385
|
<Text size="sm" fw={500}>
|
|
388
386
|
{l(user.updatedAt, { date: "ll" })}
|
|
389
387
|
</Text>
|
|
390
388
|
<Text size="xs" c="dimmed">
|
|
391
389
|
{l(user.updatedAt, { date: "fromNow" })}
|
|
392
390
|
</Text>
|
|
393
|
-
</
|
|
394
|
-
<
|
|
395
|
-
<
|
|
391
|
+
</Flex>
|
|
392
|
+
<Flex>
|
|
393
|
+
<Flex gap={6} mb={4}>
|
|
396
394
|
<IconDevices size={14} style={{ opacity: 0.5 }} />
|
|
397
395
|
<Text size="xs" c="dimmed">
|
|
398
396
|
Last Login
|
|
399
397
|
</Text>
|
|
400
|
-
</
|
|
398
|
+
</Flex>
|
|
401
399
|
<Text size="sm" c="dimmed">
|
|
402
400
|
—
|
|
403
401
|
</Text>
|
|
404
|
-
</
|
|
405
|
-
<
|
|
406
|
-
<
|
|
402
|
+
</Flex>
|
|
403
|
+
<Flex>
|
|
404
|
+
<Flex gap={6} mb={4}>
|
|
407
405
|
<IconCheck size={14} style={{ opacity: 0.5 }} />
|
|
408
406
|
<Text size="xs" c="dimmed">
|
|
409
407
|
Email Verified
|
|
410
408
|
</Text>
|
|
411
|
-
</
|
|
409
|
+
</Flex>
|
|
412
410
|
{user.emailVerified ? (
|
|
413
411
|
<>
|
|
414
412
|
<Text size="sm" fw={500}>
|
|
@@ -423,10 +421,10 @@ const AdminUserDetails = (props: AdminUserDetailsProps) => {
|
|
|
423
421
|
Not verified
|
|
424
422
|
</Text>
|
|
425
423
|
)}
|
|
426
|
-
</
|
|
424
|
+
</Flex>
|
|
427
425
|
</SimpleGrid>
|
|
428
426
|
</Card>
|
|
429
|
-
</
|
|
427
|
+
</Flex>
|
|
430
428
|
);
|
|
431
429
|
};
|
|
432
430
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Center, Flex, Loader, Text } from "@mantine/core";
|
|
2
2
|
import {
|
|
3
3
|
IconBan,
|
|
4
4
|
IconDevices,
|
|
@@ -60,10 +60,10 @@ const AdminUserLayout = (props: AdminUserLayoutProps) => {
|
|
|
60
60
|
if (!user) {
|
|
61
61
|
return (
|
|
62
62
|
<Center flex={1}>
|
|
63
|
-
<
|
|
63
|
+
<Flex direction="column" align="center" gap="xs">
|
|
64
64
|
<IconUser size={48} opacity={0.3} />
|
|
65
65
|
<Text c="dimmed">User not found</Text>
|
|
66
|
-
</
|
|
66
|
+
</Flex>
|
|
67
67
|
</Center>
|
|
68
68
|
);
|
|
69
69
|
}
|
|
@@ -130,8 +130,8 @@ const AdminUserLayout = (props: AdminUserLayoutProps) => {
|
|
|
130
130
|
};
|
|
131
131
|
|
|
132
132
|
return (
|
|
133
|
-
<
|
|
134
|
-
<
|
|
133
|
+
<Flex py="xl" px="xl" flex={1}>
|
|
134
|
+
<Flex direction="column" gap="lg">
|
|
135
135
|
<AdminResourceHeader
|
|
136
136
|
backHref={router.path("adminUsers")}
|
|
137
137
|
backLabel="Users"
|
|
@@ -213,8 +213,8 @@ const AdminUserLayout = (props: AdminUserLayoutProps) => {
|
|
|
213
213
|
/>
|
|
214
214
|
|
|
215
215
|
<NestedView />
|
|
216
|
-
</
|
|
217
|
-
</
|
|
216
|
+
</Flex>
|
|
217
|
+
</Flex>
|
|
218
218
|
);
|
|
219
219
|
};
|
|
220
220
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ActionButton, DataTable, Flex, Text } from "@alepha/ui";
|
|
2
|
-
import { Badge
|
|
2
|
+
import { Badge } from "@mantine/core";
|
|
3
3
|
import {
|
|
4
4
|
IconDeviceDesktop,
|
|
5
5
|
IconDeviceMobile,
|
|
@@ -83,7 +83,7 @@ const AdminUserSessions = (props: AdminUserSessionsProps) => {
|
|
|
83
83
|
userAgent: {
|
|
84
84
|
label: "Device",
|
|
85
85
|
value: (item) => (
|
|
86
|
-
<
|
|
86
|
+
<Flex gap={4}>
|
|
87
87
|
{item.userAgent ? (
|
|
88
88
|
<>
|
|
89
89
|
<Badge
|
|
@@ -102,7 +102,7 @@ const AdminUserSessions = (props: AdminUserSessionsProps) => {
|
|
|
102
102
|
-
|
|
103
103
|
</Text>
|
|
104
104
|
)}
|
|
105
|
-
</
|
|
105
|
+
</Flex>
|
|
106
106
|
),
|
|
107
107
|
},
|
|
108
108
|
ip: {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ActionButton, Flex, Text } from "@alepha/ui";
|
|
2
|
-
import { Alert, Card,
|
|
2
|
+
import { Alert, Card, Loader } from "@mantine/core";
|
|
3
3
|
import {
|
|
4
4
|
IconAlertCircle,
|
|
5
5
|
IconCheck,
|
|
@@ -106,7 +106,7 @@ const AdminUserSettings = (props: AdminUserSettingsProps) => {
|
|
|
106
106
|
<Flex flex={1} direction="column" gap="md">
|
|
107
107
|
{user.email && !user.emailVerified && (
|
|
108
108
|
<Card withBorder p="lg">
|
|
109
|
-
<
|
|
109
|
+
<Flex direction="column" gap="md">
|
|
110
110
|
<Text size="lg" fw={500}>
|
|
111
111
|
Email Verification
|
|
112
112
|
</Text>
|
|
@@ -126,7 +126,7 @@ const AdminUserSettings = (props: AdminUserSettingsProps) => {
|
|
|
126
126
|
</Alert>
|
|
127
127
|
)}
|
|
128
128
|
|
|
129
|
-
<
|
|
129
|
+
<Flex>
|
|
130
130
|
<ActionButton
|
|
131
131
|
leftSection={<IconMail size={16} />}
|
|
132
132
|
loading={verifyLoading}
|
|
@@ -134,13 +134,13 @@ const AdminUserSettings = (props: AdminUserSettingsProps) => {
|
|
|
134
134
|
>
|
|
135
135
|
Send Verification Link
|
|
136
136
|
</ActionButton>
|
|
137
|
-
</
|
|
138
|
-
</
|
|
137
|
+
</Flex>
|
|
138
|
+
</Flex>
|
|
139
139
|
</Card>
|
|
140
140
|
)}
|
|
141
141
|
|
|
142
142
|
<Card withBorder p="lg">
|
|
143
|
-
<
|
|
143
|
+
<Flex direction="column" gap="md">
|
|
144
144
|
<Text size="lg" fw={500} c="red">
|
|
145
145
|
Danger Zone
|
|
146
146
|
</Text>
|
|
@@ -152,7 +152,7 @@ const AdminUserSettings = (props: AdminUserSettingsProps) => {
|
|
|
152
152
|
</Text>
|
|
153
153
|
</Alert>
|
|
154
154
|
|
|
155
|
-
<
|
|
155
|
+
<Flex>
|
|
156
156
|
<ActionButton
|
|
157
157
|
color="red"
|
|
158
158
|
leftSection={<IconTrash size={16} />}
|
|
@@ -161,8 +161,8 @@ const AdminUserSettings = (props: AdminUserSettingsProps) => {
|
|
|
161
161
|
>
|
|
162
162
|
Delete User
|
|
163
163
|
</ActionButton>
|
|
164
|
-
</
|
|
165
|
-
</
|
|
164
|
+
</Flex>
|
|
165
|
+
</Flex>
|
|
166
166
|
</Card>
|
|
167
167
|
</Flex>
|
|
168
168
|
);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DataTable, Text } from "@alepha/ui";
|
|
2
|
-
import { Badge, Flex
|
|
2
|
+
import { Badge, Flex } from "@mantine/core";
|
|
3
3
|
import { IconCheck, IconUsersPlus, IconX } from "@tabler/icons-react";
|
|
4
4
|
import { type Page, t } from "alepha";
|
|
5
5
|
import {
|
|
@@ -96,7 +96,7 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
96
96
|
email: {
|
|
97
97
|
label: "Email",
|
|
98
98
|
value: (item) => (
|
|
99
|
-
<
|
|
99
|
+
<Flex gap="xs">
|
|
100
100
|
<Text size="sm">{item.email || "-"}</Text>
|
|
101
101
|
{item.email && (
|
|
102
102
|
<Badge
|
|
@@ -114,19 +114,19 @@ const AdminUsers = (props: AdminUsersProps) => {
|
|
|
114
114
|
{item.emailVerified ? "Verified" : "Unverified"}
|
|
115
115
|
</Badge>
|
|
116
116
|
)}
|
|
117
|
-
</
|
|
117
|
+
</Flex>
|
|
118
118
|
),
|
|
119
119
|
},
|
|
120
120
|
roles: {
|
|
121
121
|
label: "Roles",
|
|
122
122
|
value: (item) => (
|
|
123
|
-
<
|
|
123
|
+
<Flex gap={4}>
|
|
124
124
|
{item.roles.map((role: string) => (
|
|
125
125
|
<Badge key={role} size="xs" variant="outline">
|
|
126
126
|
{role}
|
|
127
127
|
</Badge>
|
|
128
128
|
))}
|
|
129
|
-
</
|
|
129
|
+
</Flex>
|
|
130
130
|
),
|
|
131
131
|
},
|
|
132
132
|
enabled: {
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { Flex, Text } from "@alepha/ui";
|
|
2
|
-
|
|
2
|
+
|
|
3
3
|
import { IconShieldCheck } from "@tabler/icons-react";
|
|
4
4
|
|
|
5
5
|
const AdminVerifications = () => {
|
|
6
6
|
return (
|
|
7
7
|
<Flex flex={1} justify="center" align="center">
|
|
8
|
-
<
|
|
8
|
+
<Flex direction="column" align="center" gap="xs">
|
|
9
9
|
<IconShieldCheck
|
|
10
10
|
size={48}
|
|
11
11
|
stroke={1.5}
|
|
@@ -17,7 +17,7 @@ const AdminVerifications = () => {
|
|
|
17
17
|
verification codes are generated and validated through the
|
|
18
18
|
verification API endpoints.
|
|
19
19
|
</Text>
|
|
20
|
-
</
|
|
20
|
+
</Flex>
|
|
21
21
|
</Flex>
|
|
22
22
|
);
|
|
23
23
|
};
|
package/src/admin/index.ts
CHANGED
|
@@ -6,30 +6,6 @@ import { AdminRouter } from "./AdminRouter.ts";
|
|
|
6
6
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
7
7
|
|
|
8
8
|
export { AdminRouter } from "./AdminRouter.ts";
|
|
9
|
-
// Audits
|
|
10
|
-
export { default as AdminAudits } from "./components/audits/AdminAudits.tsx";
|
|
11
|
-
// Files
|
|
12
|
-
export { default as AdminFiles } from "./components/files/AdminFiles.tsx";
|
|
13
|
-
// Jobs
|
|
14
|
-
export { default as AdminJobs } from "./components/jobs/AdminJobs.tsx";
|
|
15
|
-
// API Keys
|
|
16
|
-
export { default as AdminApiKeys } from "./components/keys/AdminApiKeys.tsx";
|
|
17
|
-
// Notifications
|
|
18
|
-
export { default as AdminNotifications } from "./components/notifications/AdminNotifications.tsx";
|
|
19
|
-
// Parameters
|
|
20
|
-
export { default as AdminParameters } from "./components/parameters/AdminParameters.tsx";
|
|
21
|
-
// Sessions
|
|
22
|
-
export { default as AdminSessions } from "./components/sessions/AdminSessions.tsx";
|
|
23
|
-
// Users
|
|
24
|
-
export { default as AdminUserAudits } from "./components/users/AdminUserAudits.tsx";
|
|
25
|
-
export { default as AdminUserCreate } from "./components/users/AdminUserCreate.tsx";
|
|
26
|
-
export { default as AdminUserDetails } from "./components/users/AdminUserDetails.tsx";
|
|
27
|
-
export { default as AdminUserLayout } from "./components/users/AdminUserLayout.tsx";
|
|
28
|
-
export { default as AdminUserSessions } from "./components/users/AdminUserSessions.tsx";
|
|
29
|
-
export { default as AdminUserSettings } from "./components/users/AdminUserSettings.tsx";
|
|
30
|
-
export { default as AdminUsers } from "./components/users/AdminUsers.tsx";
|
|
31
|
-
// Verifications
|
|
32
|
-
export { default as AdminVerifications } from "./components/verifications/AdminVerifications.tsx";
|
|
33
9
|
export * from "./primitives/$uiAdmin.ts";
|
|
34
10
|
|
|
35
11
|
// ---------------------------------------------------------------------------------------------------------------------
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ActionButton, Control, capitalize } from "@alepha/ui";
|
|
2
|
-
import { Card, Flex,
|
|
2
|
+
import { Card, Flex, Image, Text, Title } from "@mantine/core";
|
|
3
3
|
import { IconLock, IconUser } from "@tabler/icons-react";
|
|
4
4
|
import { AlephaError, t } from "alepha";
|
|
5
5
|
import type { RealmConfig } from "alepha/api/users";
|
|
@@ -115,14 +115,14 @@ const Login = (props: LoginProps) => {
|
|
|
115
115
|
|
|
116
116
|
return (
|
|
117
117
|
<Flex flex={1} justify={"center"} align={"center"}>
|
|
118
|
-
<
|
|
118
|
+
<Flex direction="column" gap={"sm"} w={360}>
|
|
119
119
|
<Card withBorder p={"lg"} bg={"var(--alepha-elevated)"}>
|
|
120
|
-
<
|
|
120
|
+
<Flex direction="column" gap={"md"}>
|
|
121
121
|
{/* Realm branding */}
|
|
122
122
|
{(settings.logoUrl ||
|
|
123
123
|
settings.displayName ||
|
|
124
124
|
settings.description) && (
|
|
125
|
-
<
|
|
125
|
+
<Flex direction="column" gap={"xs"} align="center" mb="xs">
|
|
126
126
|
{settings.logoUrl && (
|
|
127
127
|
<Image
|
|
128
128
|
src={settings.logoUrl}
|
|
@@ -142,14 +142,14 @@ const Login = (props: LoginProps) => {
|
|
|
142
142
|
{settings.description}
|
|
143
143
|
</Text>
|
|
144
144
|
)}
|
|
145
|
-
</
|
|
145
|
+
</Flex>
|
|
146
146
|
)}
|
|
147
147
|
|
|
148
148
|
{/* Credentials login form */}
|
|
149
149
|
{credentialsProvider && (
|
|
150
150
|
<>
|
|
151
151
|
<form {...form.props}>
|
|
152
|
-
<
|
|
152
|
+
<Flex direction="column" flex={1} gap={"md"}>
|
|
153
153
|
<Control
|
|
154
154
|
title={identifierTitle}
|
|
155
155
|
input={form.input.identifier}
|
|
@@ -169,7 +169,7 @@ const Login = (props: LoginProps) => {
|
|
|
169
169
|
<ActionButton variant={"filled"} form={form}>
|
|
170
170
|
{tr("loginSignIn")}
|
|
171
171
|
</ActionButton>
|
|
172
|
-
</
|
|
172
|
+
</Flex>
|
|
173
173
|
</form>
|
|
174
174
|
{settings.resetPasswordAllowed && (
|
|
175
175
|
<Text size="sm" ta="center">
|
|
@@ -188,18 +188,18 @@ const Login = (props: LoginProps) => {
|
|
|
188
188
|
|
|
189
189
|
{/* OR divider - only when both credentials AND external methods exist */}
|
|
190
190
|
{showOrDivider && (
|
|
191
|
-
<
|
|
191
|
+
<Flex align="center" justify="center" gap={"md"}>
|
|
192
192
|
<Flex flex={1} h={"1px"} bg={"var(--alepha-border)"} />
|
|
193
193
|
<Text size="xs" c={"dimmed"}>
|
|
194
194
|
{tr("loginOr")}
|
|
195
195
|
</Text>
|
|
196
196
|
<Flex flex={1} h={"1px"} bg={"var(--alepha-border)"} />
|
|
197
|
-
</
|
|
197
|
+
</Flex>
|
|
198
198
|
)}
|
|
199
199
|
|
|
200
200
|
{/* External login methods */}
|
|
201
201
|
{externalLoginMethods.length > 0 && (
|
|
202
|
-
<
|
|
202
|
+
<Flex direction="column" gap={"sm"}>
|
|
203
203
|
{externalLoginMethods.map((method) => (
|
|
204
204
|
<ActionButton
|
|
205
205
|
variant={"default"}
|
|
@@ -217,7 +217,7 @@ const Login = (props: LoginProps) => {
|
|
|
217
217
|
})}
|
|
218
218
|
</ActionButton>
|
|
219
219
|
))}
|
|
220
|
-
</
|
|
220
|
+
</Flex>
|
|
221
221
|
)}
|
|
222
222
|
|
|
223
223
|
{/* Registration link */}
|
|
@@ -234,12 +234,12 @@ const Login = (props: LoginProps) => {
|
|
|
234
234
|
</ActionButton>
|
|
235
235
|
</Text>
|
|
236
236
|
)}
|
|
237
|
-
</
|
|
237
|
+
</Flex>
|
|
238
238
|
</Card>
|
|
239
239
|
<ActionButton variant={"subtle"} href={"/"}>
|
|
240
240
|
{tr("loginCancel")}
|
|
241
241
|
</ActionButton>
|
|
242
|
-
</
|
|
242
|
+
</Flex>
|
|
243
243
|
</Flex>
|
|
244
244
|
);
|
|
245
245
|
};
|