@alepha/ui 0.13.5 → 0.13.7

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 (157) hide show
  1. package/dist/admin/AdminAudits-CwvH8e8c.js +215 -0
  2. package/dist/admin/AdminAudits-CwvH8e8c.js.map +1 -0
  3. package/dist/admin/AdminAudits-Dv8Vk_6r.js +3 -0
  4. package/dist/admin/AdminFiles-5CPA3lQk.js +3 -0
  5. package/dist/admin/{AdminFiles-B_jfB_Py.js → AdminFiles-C_w1tb_x.js} +4 -3
  6. package/dist/admin/AdminFiles-C_w1tb_x.js.map +1 -0
  7. package/dist/admin/AdminLayout-BnSmtA4x.js +3 -0
  8. package/dist/admin/AdminLayout-XiSivwWH.js +39 -0
  9. package/dist/admin/AdminLayout-XiSivwWH.js.map +1 -0
  10. package/dist/admin/AdminNotifications-DLjmZWtf.js +3 -0
  11. package/dist/admin/{AdminNotifications-BFEjqpqx.js → AdminNotifications-DuYy74AN.js} +3 -3
  12. package/dist/admin/AdminNotifications-DuYy74AN.js.map +1 -0
  13. package/dist/admin/AdminParameters-DYg48Jwe.js +3 -0
  14. package/dist/admin/AdminParameters-YagqWTG3.js +575 -0
  15. package/dist/admin/AdminParameters-YagqWTG3.js.map +1 -0
  16. package/dist/admin/{AdminSessions-D7DESfWK.js → AdminSessions-BCjgJ-93.js} +4 -4
  17. package/dist/admin/AdminSessions-BCjgJ-93.js.map +1 -0
  18. package/dist/admin/AdminSessions-DEh2uN-4.js +3 -0
  19. package/dist/admin/AdminUserAudits-B_PUXCKC.js +177 -0
  20. package/dist/admin/AdminUserAudits-B_PUXCKC.js.map +1 -0
  21. package/dist/admin/AdminUserAudits-D7cTcElL.js +3 -0
  22. package/dist/admin/{AdminUserCreate-Bhxsn92l.js → AdminUserCreate-DzfRbGZ4.js} +4 -4
  23. package/dist/admin/AdminUserCreate-DzfRbGZ4.js.map +1 -0
  24. package/dist/admin/{AdminUserCreate-CYI_xW5T.js → AdminUserCreate-oUA1KDIl.js} +1 -1
  25. package/dist/admin/{AdminUserDetails-C2y1Ig4n.js → AdminUserDetails-DeTrJm-t.js} +5 -5
  26. package/dist/admin/AdminUserDetails-DeTrJm-t.js.map +1 -0
  27. package/dist/admin/{AdminUserDetails-Cmzx9HxH.js → AdminUserDetails-y1H5DW8Y.js} +1 -1
  28. package/dist/admin/{AdminUserLayout-sW6cjZL0.js → AdminUserLayout-CsfrrZkD.js} +4 -7
  29. package/dist/admin/AdminUserLayout-CsfrrZkD.js.map +1 -0
  30. package/dist/admin/{AdminUserLayout-DGSf612u.js → AdminUserLayout-Dejnz13m.js} +1 -1
  31. package/dist/admin/AdminUserSessions-Bbhcpz4k.js +3 -0
  32. package/dist/admin/{AdminUserSessions-CvN15wPe.js → AdminUserSessions-DO9H85O-.js} +4 -4
  33. package/dist/admin/AdminUserSessions-DO9H85O-.js.map +1 -0
  34. package/dist/admin/{AdminUserSettings-DvaaxgcV.js → AdminUserSettings-B3jA8g3p.js} +4 -4
  35. package/dist/admin/AdminUserSettings-B3jA8g3p.js.map +1 -0
  36. package/dist/admin/AdminUserSettings-CE0xpbQc.js +3 -0
  37. package/dist/admin/AdminUsers-CegGZDhW.js +3 -0
  38. package/dist/admin/{AdminUsers-BR3C-jrg.js → AdminUsers-ebbrJBT0.js} +13 -17
  39. package/dist/admin/AdminUsers-ebbrJBT0.js.map +1 -0
  40. package/dist/admin/index.d.ts +2044 -1044
  41. package/dist/admin/index.js +65 -62
  42. package/dist/admin/index.js.map +1 -1
  43. package/dist/auth/AuthLayout-BAZJHzDG.js +23 -0
  44. package/dist/auth/AuthLayout-BAZJHzDG.js.map +1 -0
  45. package/dist/auth/{Login-7HlBjDeV.js → Login-CeNZZjrr.js} +80 -44
  46. package/dist/auth/Login-CeNZZjrr.js.map +1 -0
  47. package/dist/auth/Login-hQcu1nlu.js +4 -0
  48. package/dist/auth/Register-B6HBNVHS.js +4 -0
  49. package/dist/auth/{Register-CuQr3kgi.js → Register-s4ENeyiE.js} +131 -91
  50. package/dist/auth/Register-s4ENeyiE.js.map +1 -0
  51. package/dist/auth/ResetPassword-Cjd-W-Nu.js +3 -0
  52. package/dist/auth/ResetPassword-GLIFkJT7.js +278 -0
  53. package/dist/auth/ResetPassword-GLIFkJT7.js.map +1 -0
  54. package/dist/auth/index.d.ts +471 -426
  55. package/dist/auth/index.js +26 -18
  56. package/dist/auth/index.js.map +1 -1
  57. package/dist/core/index.d.ts +400 -130
  58. package/dist/core/index.js +1751 -1369
  59. package/dist/core/index.js.map +1 -1
  60. package/package.json +15 -11
  61. package/src/admin/AdminRouter.ts +70 -16
  62. package/src/admin/components/AdminLayout.tsx +41 -61
  63. package/src/admin/components/audits/AdminAudits.tsx +240 -0
  64. package/src/admin/components/{AdminFiles.tsx → files/AdminFiles.tsx} +1 -1
  65. package/src/admin/components/{AdminJobs.tsx → jobs/AdminJobs.tsx} +1 -1
  66. package/src/admin/components/parameters/AdminParameters.tsx +137 -0
  67. package/src/admin/components/parameters/ParameterDetails.tsx +228 -0
  68. package/src/admin/components/parameters/ParameterHistory.tsx +146 -0
  69. package/src/admin/components/parameters/ParameterTree.tsx +146 -0
  70. package/src/admin/components/parameters/types.ts +35 -0
  71. package/src/admin/components/{AdminSessions.tsx → sessions/AdminSessions.tsx} +1 -1
  72. package/src/admin/components/users/AdminUserAudits.tsx +183 -0
  73. package/src/admin/components/{AdminUserCreate.tsx → users/AdminUserCreate.tsx} +1 -1
  74. package/src/admin/components/{AdminUserLayout.tsx → users/AdminUserLayout.tsx} +1 -4
  75. package/src/admin/components/{AdminUserSettings.tsx → users/AdminUserSettings.tsx} +1 -1
  76. package/src/admin/components/{AdminUsers.tsx → users/AdminUsers.tsx} +10 -12
  77. package/src/admin/index.ts +24 -16
  78. package/src/auth/AuthRouter.ts +23 -17
  79. package/src/auth/components/AuthLayout.tsx +6 -3
  80. package/src/auth/components/Login.tsx +109 -47
  81. package/src/auth/components/Register.tsx +158 -94
  82. package/src/auth/components/ResetPassword.tsx +51 -5
  83. package/src/auth/components/buttons/UserButton.tsx +2 -0
  84. package/src/core/atoms/alephaThemeAtom.ts +13 -0
  85. package/src/core/atoms/alephaThemeListAtom.ts +10 -0
  86. package/src/core/atoms/themes/default.ts +6 -0
  87. package/src/core/{themes → atoms/themes}/midnight.ts +3 -5
  88. package/src/core/components/buttons/ActionButton.tsx +33 -26
  89. package/src/core/components/buttons/DarkModeButton.tsx +0 -1
  90. package/src/core/components/buttons/ThemeButton.tsx +10 -7
  91. package/src/core/components/buttons/ToggleSidebarButton.tsx +19 -16
  92. package/src/core/components/data/ErrorViewer.tsx +171 -0
  93. package/src/core/components/data/JsonViewer.tsx +147 -138
  94. package/src/core/components/form/Control.tsx +95 -18
  95. package/src/core/components/form/ControlArray.tsx +377 -0
  96. package/src/core/components/form/ControlObject.tsx +127 -0
  97. package/src/core/components/form/TypeForm.tsx +99 -37
  98. package/src/core/components/layout/AdminShell.tsx +14 -1
  99. package/src/core/components/layout/AlephaMantineProvider.tsx +7 -3
  100. package/src/core/components/layout/Omnibar.tsx +1 -1
  101. package/src/core/components/layout/Sidebar.tsx +47 -14
  102. package/src/core/components/table/ColumnPicker.tsx +126 -0
  103. package/src/core/components/table/DataTable.tsx +354 -181
  104. package/src/core/components/table/DataTableFilters.tsx +64 -0
  105. package/src/core/components/table/DataTablePagination.tsx +59 -0
  106. package/src/core/components/table/DataTableToolbar.tsx +126 -0
  107. package/src/core/components/table/FilterPicker.tsx +138 -0
  108. package/src/core/components/table/types.ts +199 -0
  109. package/src/core/helpers/isComponentType.ts +9 -0
  110. package/src/core/helpers/renderIcon.tsx +13 -0
  111. package/src/core/hooks/useTheme.ts +24 -18
  112. package/src/core/index.ts +24 -3
  113. package/src/core/interfaces/AlephaTheme.ts +8 -0
  114. package/src/core/providers/ThemeProvider.ts +44 -62
  115. package/src/core/services/DialogService.tsx +24 -0
  116. package/src/core/utils/parseInput.ts +2 -2
  117. package/styles.css +1 -1
  118. package/dist/admin/AdminFiles-B-0UcHVV.js +0 -3
  119. package/dist/admin/AdminFiles-B_jfB_Py.js.map +0 -1
  120. package/dist/admin/AdminLayout-BMtiXAzS.js +0 -396
  121. package/dist/admin/AdminLayout-BMtiXAzS.js.map +0 -1
  122. package/dist/admin/AdminLayout-BNo3GoHR.js +0 -3
  123. package/dist/admin/AdminNotifications-BFEjqpqx.js.map +0 -1
  124. package/dist/admin/AdminNotifications-DJs2ZjNj.js +0 -3
  125. package/dist/admin/AdminSessions-D7DESfWK.js.map +0 -1
  126. package/dist/admin/AdminSessions-PS2M8iXi.js +0 -3
  127. package/dist/admin/AdminUserCreate-Bhxsn92l.js.map +0 -1
  128. package/dist/admin/AdminUserDetails-C2y1Ig4n.js.map +0 -1
  129. package/dist/admin/AdminUserLayout-sW6cjZL0.js.map +0 -1
  130. package/dist/admin/AdminUserSessions-CvN15wPe.js.map +0 -1
  131. package/dist/admin/AdminUserSessions-D-aOcZgV.js +0 -3
  132. package/dist/admin/AdminUserSettings-CEMhIYrI.js +0 -3
  133. package/dist/admin/AdminUserSettings-DvaaxgcV.js.map +0 -1
  134. package/dist/admin/AdminUsers-BR3C-jrg.js.map +0 -1
  135. package/dist/admin/AdminUsers-CMW9vN09.js +0 -3
  136. package/dist/auth/AuthLayout-CzwUKD9y.js +0 -19
  137. package/dist/auth/AuthLayout-CzwUKD9y.js.map +0 -1
  138. package/dist/auth/Login-7HlBjDeV.js.map +0 -1
  139. package/dist/auth/Login-C-e27DGb.js +0 -4
  140. package/dist/auth/Register-CuQr3kgi.js.map +0 -1
  141. package/dist/auth/Register-DbvXwgbG.js +0 -4
  142. package/dist/auth/ResetPassword-BzU-cdd4.js +0 -243
  143. package/dist/auth/ResetPassword-BzU-cdd4.js.map +0 -1
  144. package/dist/auth/ResetPassword-DSvrdpaA.js +0 -3
  145. package/src/admin/AdminSidebar.ts +0 -31
  146. package/src/admin/components/AdminParameters.tsx +0 -24
  147. package/src/core/themes/aurora.ts +0 -107
  148. package/src/core/themes/crystal.ts +0 -107
  149. package/src/core/themes/default.ts +0 -7
  150. package/src/core/themes/ember.ts +0 -107
  151. package/src/core/themes/index.ts +0 -7
  152. package/src/core/themes/remoraid.ts +0 -278
  153. package/src/core/themes/slate.ts +0 -81
  154. /package/src/admin/components/{AdminNotifications.tsx → notifications/AdminNotifications.tsx} +0 -0
  155. /package/src/admin/components/{AdminUserDetails.tsx → users/AdminUserDetails.tsx} +0 -0
  156. /package/src/admin/components/{AdminUserSessions.tsx → users/AdminUserSessions.tsx} +0 -0
  157. /package/src/admin/components/{AdminVerifications.tsx → verifications/AdminVerifications.tsx} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminSessions-BCjgJ-93.js","names":["filters"],"sources":["../../src/admin/components/sessions/AdminSessions.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Group } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type SessionController,\n type SessionEntity,\n sessions,\n} from \"alepha/api/users\";\nimport { useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminSessionsProps {\n userRealmName?: string;\n}\n\nconst AdminSessions = (props: AdminSessionsProps) => {\n const client = useClient<SessionController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n const [refreshKey, setRefreshKey] = useState(0);\n\n const filters = t.object({\n userId: t.optional(\n t.uuid({\n $control: {\n query: t.pick(sessions.schema, [\"userId\"]),\n },\n }),\n ),\n });\n\n const getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n };\n\n const isExpired = (expiresAt: Date | string) => {\n return new Date(expiresAt) < new Date();\n };\n\n const handleDelete = async (sessionId: string) => {\n await client.deleteSession({\n params: { id: sessionId },\n query: { userRealmName: props.userRealmName },\n });\n setRefreshKey((k) => k + 1);\n };\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<SessionEntity, typeof filters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"userId\") {\n return form.submit();\n }\n }}\n filters={filters}\n tableTrProps={(item) => {\n if (isExpired(item.expiresAt)) {\n return {\n opacity: 0.5,\n };\n }\n return {};\n }}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n\n return response as Page<SessionEntity>;\n }}\n columns={{\n userId: {\n label: \"User\",\n value: (item) => (\n <ActionButton\n variant=\"subtle\"\n size=\"xs\"\n href={router.path(\"adminUserDetails\", {\n params: { userId: item.userId },\n })}\n >\n <Text size=\"xs\" ff=\"monospace\">\n {item.userId.slice(0, 8)}...\n </Text>\n </ActionButton>\n ),\n },\n userAgent: {\n label: \"Device\",\n fit: true,\n value: (item) => (\n <Group gap={4}>\n {item.userAgent ? (\n <>\n <Badge\n size=\"xs\"\n variant=\"light\"\n leftSection={getDeviceIcon(item.userAgent.device)}\n >\n {item.userAgent.device}\n </Badge>\n <Text size=\"xs\" c=\"dimmed\">\n {item.userAgent.browser} / {item.userAgent.os}\n </Text>\n </>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n )}\n </Group>\n ),\n },\n ip: {\n label: \"IP\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" c=\"dimmed\">\n {item.ip || \"-\"}\n </Text>\n ),\n },\n expiresAt: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"red\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n actions: {\n label: \"\",\n fit: true,\n value: (item) => (\n <ActionButton\n size=\"xs\"\n variant=\"subtle\"\n color=\"red\"\n onClick={() => handleDelete(item.id)}\n >\n <IconTrash size={14} />\n </ActionButton>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminSessions;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as AdminSessions_default } from "./AdminSessions-BCjgJ-93.js";
2
+
3
+ export { AdminSessions_default as default };
@@ -0,0 +1,177 @@
1
+ import { DataTable, Flex, Text } from "@alepha/ui";
2
+ import { t } from "alepha";
3
+ import { useClient, useRouterState } from "@alepha/react";
4
+ import { IconAlertTriangle, IconCheck, IconInfoCircle, IconX } from "@tabler/icons-react";
5
+ import { jsx, jsxs } from "react/jsx-runtime";
6
+ import { useI18n } from "@alepha/react/i18n";
7
+ import { Badge, Group, Tooltip } from "@mantine/core";
8
+
9
+ //#region ../../src/admin/components/users/AdminUserAudits.tsx
10
+ const getSeverityColor = (severity) => {
11
+ switch (severity) {
12
+ case "critical": return "red";
13
+ case "warning": return "yellow";
14
+ default: return "blue";
15
+ }
16
+ };
17
+ const getSeverityIcon = (severity) => {
18
+ switch (severity) {
19
+ case "critical": return /* @__PURE__ */ jsx(IconAlertTriangle, { size: 12 });
20
+ case "warning": return /* @__PURE__ */ jsx(IconAlertTriangle, { size: 12 });
21
+ default: return /* @__PURE__ */ jsx(IconInfoCircle, { size: 12 });
22
+ }
23
+ };
24
+ const AdminUserAudits = (_props) => {
25
+ const state = useRouterState();
26
+ const client = useClient();
27
+ const { l } = useI18n();
28
+ const userId = state.params.userId;
29
+ return /* @__PURE__ */ jsx(Flex, {
30
+ flex: 1,
31
+ direction: "column",
32
+ children: /* @__PURE__ */ jsx(DataTable, {
33
+ submitOnInit: true,
34
+ defaultSize: 15,
35
+ typeFormProps: {
36
+ skipSubmitButton: true,
37
+ columns: 4
38
+ },
39
+ tableProps: {
40
+ horizontalSpacing: "xs",
41
+ verticalSpacing: "xs",
42
+ striped: false,
43
+ highlightOnHover: true
44
+ },
45
+ filters: t.object({
46
+ type: t.optional(t.text()),
47
+ action: t.optional(t.text()),
48
+ severity: t.optional(t.enum([
49
+ "info",
50
+ "warning",
51
+ "critical"
52
+ ])),
53
+ success: t.optional(t.boolean()),
54
+ from: t.optional(t.datetime()),
55
+ to: t.optional(t.datetime())
56
+ }),
57
+ items: async (query) => {
58
+ return await client.findByUser({
59
+ params: { userId },
60
+ query
61
+ });
62
+ },
63
+ columns: {
64
+ type: {
65
+ label: "Type",
66
+ fit: true,
67
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
68
+ size: "sm",
69
+ variant: "light",
70
+ color: "grape",
71
+ children: item.type
72
+ })
73
+ },
74
+ action: {
75
+ label: "Action",
76
+ fit: true,
77
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
78
+ size: "sm",
79
+ variant: "outline",
80
+ children: item.action
81
+ })
82
+ },
83
+ severity: {
84
+ label: "Severity",
85
+ fit: true,
86
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
87
+ size: "sm",
88
+ variant: "light",
89
+ color: getSeverityColor(item.severity),
90
+ leftSection: getSeverityIcon(item.severity),
91
+ children: item.severity
92
+ })
93
+ },
94
+ description: {
95
+ label: "Description",
96
+ value: (item) => /* @__PURE__ */ jsx(Text, {
97
+ size: "sm",
98
+ lineClamp: 1,
99
+ children: item.description || "-"
100
+ })
101
+ },
102
+ resource: {
103
+ label: "Resource",
104
+ fit: true,
105
+ value: (item) => item.resourceType ? /* @__PURE__ */ jsx(Tooltip, {
106
+ label: item.resourceId || "N/A",
107
+ children: /* @__PURE__ */ jsx(Badge, {
108
+ size: "xs",
109
+ variant: "dot",
110
+ color: "gray",
111
+ children: item.resourceType
112
+ })
113
+ }) : /* @__PURE__ */ jsx(Text, {
114
+ size: "xs",
115
+ c: "dimmed",
116
+ children: "-"
117
+ })
118
+ },
119
+ success: {
120
+ label: "Status",
121
+ fit: true,
122
+ value: (item) => item.success ? /* @__PURE__ */ jsxs(Group, {
123
+ gap: 4,
124
+ children: [/* @__PURE__ */ jsx(IconCheck, {
125
+ size: 14,
126
+ color: "var(--mantine-color-green-6)"
127
+ }), /* @__PURE__ */ jsx(Text, {
128
+ size: "xs",
129
+ c: "green",
130
+ children: "Success"
131
+ })]
132
+ }) : /* @__PURE__ */ jsx(Tooltip, {
133
+ label: item.errorMessage || "Failed",
134
+ children: /* @__PURE__ */ jsxs(Group, {
135
+ gap: 4,
136
+ children: [/* @__PURE__ */ jsx(IconX, {
137
+ size: 14,
138
+ color: "var(--mantine-color-red-6)"
139
+ }), /* @__PURE__ */ jsx(Text, {
140
+ size: "xs",
141
+ c: "red",
142
+ children: "Failed"
143
+ })]
144
+ })
145
+ })
146
+ },
147
+ ipAddress: {
148
+ label: "IP",
149
+ fit: true,
150
+ value: (item) => /* @__PURE__ */ jsx(Text, {
151
+ size: "xs",
152
+ c: "dimmed",
153
+ ff: "monospace",
154
+ children: item.ipAddress || "-"
155
+ })
156
+ },
157
+ createdAt: {
158
+ label: "Time",
159
+ fit: true,
160
+ value: (item) => /* @__PURE__ */ jsx(Tooltip, {
161
+ label: l(item.createdAt, { date: "medium" }),
162
+ children: /* @__PURE__ */ jsx(Text, {
163
+ size: "xs",
164
+ c: "dimmed",
165
+ children: l(item.createdAt, { date: "fromNow" })
166
+ })
167
+ })
168
+ }
169
+ }
170
+ })
171
+ });
172
+ };
173
+ var AdminUserAudits_default = AdminUserAudits;
174
+
175
+ //#endregion
176
+ export { AdminUserAudits_default as t };
177
+ //# sourceMappingURL=AdminUserAudits-B_PUXCKC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserAudits-B_PUXCKC.js","names":[],"sources":["../../src/admin/components/users/AdminUserAudits.tsx"],"sourcesContent":["import { useClient, useRouterState } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Group, Tooltip } from \"@mantine/core\";\nimport {\n IconAlertTriangle,\n IconCheck,\n IconInfoCircle,\n IconX,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { AuditController, AuditEntity } from \"alepha/api/audits\";\n\nexport interface AdminUserAuditsProps {\n userRealmName?: string;\n}\n\nconst getSeverityColor = (severity: string) => {\n switch (severity) {\n case \"critical\":\n return \"red\";\n case \"warning\":\n return \"yellow\";\n default:\n return \"blue\";\n }\n};\n\nconst getSeverityIcon = (severity: string) => {\n switch (severity) {\n case \"critical\":\n return <IconAlertTriangle size={12} />;\n case \"warning\":\n return <IconAlertTriangle size={12} />;\n default:\n return <IconInfoCircle size={12} />;\n }\n};\n\nconst AdminUserAudits = (_props: AdminUserAuditsProps) => {\n const state = useRouterState();\n const client = useClient<AuditController>();\n const { l } = useI18n();\n const userId = state.params.userId as string;\n\n const filters = t.object({\n type: t.optional(t.text()),\n action: t.optional(t.text()),\n severity: t.optional(t.enum([\"info\", \"warning\", \"critical\"])),\n success: t.optional(t.boolean()),\n from: t.optional(t.datetime()),\n to: t.optional(t.datetime()),\n });\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<AuditEntity, typeof filters>\n submitOnInit\n defaultSize={15}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 4,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n striped: false,\n highlightOnHover: true,\n }}\n filters={filters}\n items={async (query) => {\n const response = await client.findByUser({\n params: { userId },\n query,\n });\n return response as Page<AuditEntity>;\n }}\n columns={{\n type: {\n label: \"Type\",\n fit: true,\n value: (item) => (\n <Badge size=\"sm\" variant=\"light\" color=\"grape\">\n {item.type}\n </Badge>\n ),\n },\n action: {\n label: \"Action\",\n fit: true,\n value: (item) => (\n <Badge size=\"sm\" variant=\"outline\">\n {item.action}\n </Badge>\n ),\n },\n severity: {\n label: \"Severity\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={getSeverityColor(item.severity)}\n leftSection={getSeverityIcon(item.severity)}\n >\n {item.severity}\n </Badge>\n ),\n },\n description: {\n label: \"Description\",\n value: (item) => (\n <Text size=\"sm\" lineClamp={1}>\n {item.description || \"-\"}\n </Text>\n ),\n },\n resource: {\n label: \"Resource\",\n fit: true,\n value: (item) =>\n item.resourceType ? (\n <Tooltip label={item.resourceId || \"N/A\"}>\n <Badge size=\"xs\" variant=\"dot\" color=\"gray\">\n {item.resourceType}\n </Badge>\n </Tooltip>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n success: {\n label: \"Status\",\n fit: true,\n value: (item) =>\n item.success ? (\n <Group gap={4}>\n <IconCheck size={14} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"xs\" c=\"green\">\n Success\n </Text>\n </Group>\n ) : (\n <Tooltip label={item.errorMessage || \"Failed\"}>\n <Group gap={4}>\n <IconX size={14} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"xs\" c=\"red\">\n Failed\n </Text>\n </Group>\n </Tooltip>\n ),\n },\n ipAddress: {\n label: \"IP\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {item.ipAddress || \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Time\",\n fit: true,\n value: (item) => (\n <Tooltip label={l(item.createdAt, { date: \"medium\" })}>\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n </Tooltip>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminUserAudits;\n"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as AdminUserAudits_default } from "./AdminUserAudits-B_PUXCKC.js";
2
+
3
+ export { AdminUserAudits_default as default };
@@ -1,11 +1,11 @@
1
1
  import { ActionButton, Control, Flex } from "@alepha/ui";
2
2
  import { t } from "alepha";
3
3
  import { useClient, useRouter } from "@alepha/react";
4
- import { useForm } from "@alepha/react/form";
5
- import { Card, Stack, Text as Text$1 } from "@mantine/core";
6
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Card, Stack, Text as Text$1 } from "@mantine/core";
6
+ import { useForm } from "@alepha/react/form";
7
7
 
8
- //#region ../../src/admin/components/AdminUserCreate.tsx
8
+ //#region ../../src/admin/components/users/AdminUserCreate.tsx
9
9
  const AdminUserCreate = (props) => {
10
10
  const client = useClient();
11
11
  const router = useRouter();
@@ -100,4 +100,4 @@ var AdminUserCreate_default = AdminUserCreate;
100
100
 
101
101
  //#endregion
102
102
  export { AdminUserCreate_default as t };
103
- //# sourceMappingURL=AdminUserCreate-Bhxsn92l.js.map
103
+ //# sourceMappingURL=AdminUserCreate-DzfRbGZ4.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserCreate-DzfRbGZ4.js","names":["Text"],"sources":["../../src/admin/components/users/AdminUserCreate.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useForm } from \"@alepha/react/form\";\nimport { ActionButton, Control, Flex } from \"@alepha/ui\";\nimport { Card, Stack, Text } from \"@mantine/core\";\nimport { t } from \"alepha\";\nimport type { UserController } from \"alepha/api/users\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminUserCreateProps {\n userRealmName?: string;\n}\n\nconst AdminUserCreate = (props: AdminUserCreateProps) => {\n const client = useClient<UserController>();\n const router = useRouter<AdminRouter>();\n\n const form = useForm({\n schema: t.object({\n username: t.optional(\n t.shortText({\n minLength: 3,\n maxLength: 50,\n pattern: \"^[a-zA-Z0-9._-]+$\",\n }),\n ),\n email: t.optional(t.email()),\n phoneNumber: t.optional(t.e164()),\n firstName: t.optional(t.string()),\n lastName: t.optional(t.string()),\n roles: t.optional(t.array(t.string())),\n enabled: t.optional(t.boolean()),\n password: t.optional(t.string({ minLength: 8 })),\n }),\n handler: async (data) => {\n const user = await client.createUser({\n query: {\n userRealmName: props.userRealmName,\n },\n body: {\n ...data,\n enabled: data.enabled ?? true,\n },\n });\n\n await router.go(\"adminUserDetails\", {\n params: { userId: user.id },\n });\n },\n });\n\n return (\n <Flex flex={1} p=\"md\">\n <Card withBorder p=\"lg\" maw={600} w=\"100%\">\n <form {...form.props}>\n <Stack gap=\"md\">\n <Text size=\"lg\" fw={500}>\n Create New User\n </Text>\n\n <Control title=\"Username\" input={form.input.username} />\n\n <Control title=\"Email\" input={form.input.email} />\n\n <Control title=\"Phone Number\" input={form.input.phoneNumber} />\n\n <Control title=\"First Name\" input={form.input.firstName} />\n\n <Control title=\"Last Name\" input={form.input.lastName} />\n\n <Control title=\"Password\" input={form.input.password} password />\n\n <Control title=\"Roles\" input={form.input.roles} />\n\n <Control title=\"Enabled\" input={form.input.enabled} />\n\n <ActionButton form={form}>Create User</ActionButton>\n </Stack>\n </form>\n </Card>\n </Flex>\n );\n};\n\nexport default AdminUserCreate;\n"],"mappings":";;;;;;;;AAYA,MAAM,mBAAmB,UAAgC;CACvD,MAAM,SAAS,WAA2B;CAC1C,MAAM,SAAS,WAAwB;CAEvC,MAAM,OAAO,QAAQ;EACnB,QAAQ,EAAE,OAAO;GACf,UAAU,EAAE,SACV,EAAE,UAAU;IACV,WAAW;IACX,WAAW;IACX,SAAS;IACV,CAAC,CACH;GACD,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC;GAC5B,aAAa,EAAE,SAAS,EAAE,MAAM,CAAC;GACjC,WAAW,EAAE,SAAS,EAAE,QAAQ,CAAC;GACjC,UAAU,EAAE,SAAS,EAAE,QAAQ,CAAC;GAChC,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC;GACtC,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC;GAChC,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,CAAC;GACjD,CAAC;EACF,SAAS,OAAO,SAAS;GACvB,MAAM,OAAO,MAAM,OAAO,WAAW;IACnC,OAAO,EACL,eAAe,MAAM,eACtB;IACD,MAAM;KACJ,GAAG;KACH,SAAS,KAAK,WAAW;KAC1B;IACF,CAAC;AAEF,SAAM,OAAO,GAAG,oBAAoB,EAClC,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC5B,CAAC;;EAEL,CAAC;AAEF,QACE,oBAAC;EAAK,MAAM;EAAG,GAAE;YACf,oBAAC;GAAK;GAAW,GAAE;GAAK,KAAK;GAAK,GAAE;aAClC,oBAAC;IAAK,GAAI,KAAK;cACb,qBAAC;KAAM,KAAI;;MACT,oBAACA;OAAK,MAAK;OAAK,IAAI;iBAAK;QAElB;MAEP,oBAAC;OAAQ,OAAM;OAAW,OAAO,KAAK,MAAM;QAAY;MAExD,oBAAC;OAAQ,OAAM;OAAQ,OAAO,KAAK,MAAM;QAAS;MAElD,oBAAC;OAAQ,OAAM;OAAe,OAAO,KAAK,MAAM;QAAe;MAE/D,oBAAC;OAAQ,OAAM;OAAa,OAAO,KAAK,MAAM;QAAa;MAE3D,oBAAC;OAAQ,OAAM;OAAY,OAAO,KAAK,MAAM;QAAY;MAEzD,oBAAC;OAAQ,OAAM;OAAW,OAAO,KAAK,MAAM;OAAU;QAAW;MAEjE,oBAAC;OAAQ,OAAM;OAAQ,OAAO,KAAK,MAAM;QAAS;MAElD,oBAAC;OAAQ,OAAM;OAAU,OAAO,KAAK,MAAM;QAAW;MAEtD,oBAAC;OAAmB;iBAAM;QAA0B;;MAC9C;KACH;IACF;GACF;;AAIX,8BAAe"}
@@ -1,3 +1,3 @@
1
- import { t as AdminUserCreate_default } from "./AdminUserCreate-Bhxsn92l.js";
1
+ import { t as AdminUserCreate_default } from "./AdminUserCreate-DzfRbGZ4.js";
2
2
 
3
3
  export { AdminUserCreate_default as default };
@@ -2,13 +2,13 @@ import { ActionButton, Control, Flex, Text } from "@alepha/ui";
2
2
  import { t } from "alepha";
3
3
  import { useClient, useRouterState } from "@alepha/react";
4
4
  import { IconCheck, IconX } from "@tabler/icons-react";
5
- import { useEffect, useState } from "react";
6
- import { useForm } from "@alepha/react/form";
7
- import { Card, Group, Loader, Stack } from "@mantine/core";
8
5
  import { jsx, jsxs } from "react/jsx-runtime";
9
6
  import { useI18n } from "@alepha/react/i18n";
7
+ import { Card, Group, Loader, Stack } from "@mantine/core";
8
+ import { useEffect, useState } from "react";
9
+ import { useForm } from "@alepha/react/form";
10
10
 
11
- //#region ../../src/admin/components/AdminUserDetails.tsx
11
+ //#region ../../src/admin/components/users/AdminUserDetails.tsx
12
12
  const AdminUserDetails = (props) => {
13
13
  const state = useRouterState();
14
14
  const client = useClient();
@@ -218,4 +218,4 @@ var AdminUserDetails_default = AdminUserDetails;
218
218
 
219
219
  //#endregion
220
220
  export { AdminUserDetails_default as t };
221
- //# sourceMappingURL=AdminUserDetails-C2y1Ig4n.js.map
221
+ //# sourceMappingURL=AdminUserDetails-DeTrJm-t.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserDetails-DeTrJm-t.js","names":[],"sources":["../../src/admin/components/users/AdminUserDetails.tsx"],"sourcesContent":["import { useClient, useRouterState } from \"@alepha/react\";\nimport { useForm } from \"@alepha/react/form\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, Control, Flex, Text } from \"@alepha/ui\";\nimport { Card, Group, Loader, Stack } from \"@mantine/core\";\nimport { IconCheck, IconX } from \"@tabler/icons-react\";\nimport { t } from \"alepha\";\nimport type { UserController, UserEntity } from \"alepha/api/users\";\nimport { useEffect, useState } from \"react\";\n\nexport interface AdminUserDetailsProps {\n userRealmName?: string;\n}\n\nconst AdminUserDetails = (props: AdminUserDetailsProps) => {\n const state = useRouterState();\n const client = useClient<UserController>();\n const { l } = useI18n();\n const userId = state.params.userId as string;\n\n const [user, setUser] = useState<UserEntity | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const loadUser = async () => {\n try {\n const data = await client.getUser({\n params: { id: userId },\n query: { userRealmName: props.userRealmName },\n });\n setUser(data);\n } finally {\n setLoading(false);\n }\n };\n\n loadUser();\n }, [userId]);\n\n const form = useForm({\n schema: t.object({\n email: t.optional(t.email()),\n phoneNumber: t.optional(t.e164()),\n firstName: t.optional(t.string()),\n lastName: t.optional(t.string()),\n roles: t.optional(t.array(t.string())),\n enabled: t.optional(t.boolean()),\n }),\n handler: async (data) => {\n const updated = await client.updateUser({\n params: { id: userId },\n query: { userRealmName: props.userRealmName },\n body: data,\n });\n setUser(updated);\n },\n });\n\n useEffect(() => {\n if (user) {\n form.input.email?.set(user.email ?? \"\");\n form.input.phoneNumber?.set(user.phoneNumber ?? \"\");\n form.input.firstName?.set(user.firstName ?? \"\");\n form.input.lastName?.set(user.lastName ?? \"\");\n form.input.roles?.set(user.roles ?? []);\n form.input.enabled?.set(user.enabled);\n }\n }, [user]);\n\n if (loading) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Loader />\n </Flex>\n );\n }\n\n if (!user) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Text c=\"dimmed\">User not found</Text>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} direction=\"column\" gap=\"md\">\n <Card withBorder p=\"lg\">\n <Stack gap=\"md\">\n <Text size=\"lg\" fw={500}>\n User Details\n </Text>\n\n <Group gap=\"xl\">\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n User ID\n </Text>\n <Text size=\"sm\" ff=\"monospace\">\n {user.id}\n </Text>\n </Stack>\n\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n Username\n </Text>\n <Text size=\"sm\">{user.username || \"-\"}</Text>\n </Stack>\n\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n Email Verified\n </Text>\n {user.emailVerified ? (\n <Group gap={4}>\n <IconCheck size={14} color=\"var(--mantine-color-green-6)\" />\n <Text size=\"sm\" c=\"green\">\n Verified\n </Text>\n </Group>\n ) : (\n <Group gap={4}>\n <IconX size={14} color=\"var(--mantine-color-red-6)\" />\n <Text size=\"sm\" c=\"red\">\n Not Verified\n </Text>\n </Group>\n )}\n </Stack>\n\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n Created\n </Text>\n <Text size=\"sm\">{l(user.createdAt, { date: \"medium\" })}</Text>\n </Stack>\n\n <Stack gap={4}>\n <Text size=\"xs\" c=\"dimmed\">\n Updated\n </Text>\n <Text size=\"sm\">{l(user.updatedAt, { date: \"medium\" })}</Text>\n </Stack>\n </Group>\n </Stack>\n </Card>\n\n <Card withBorder p=\"lg\">\n <form {...form.props}>\n <Stack gap=\"md\">\n <Text size=\"lg\" fw={500}>\n Edit User\n </Text>\n\n <Group grow>\n <Control title=\"Email\" input={form.input.email} />\n <Control title=\"Phone Number\" input={form.input.phoneNumber} />\n </Group>\n\n <Group grow>\n <Control title=\"First Name\" input={form.input.firstName} />\n <Control title=\"Last Name\" input={form.input.lastName} />\n </Group>\n\n <Control title=\"Roles\" input={form.input.roles} />\n\n <Control title=\"Enabled\" input={form.input.enabled} />\n\n <Group>\n <ActionButton form={form}>Save Changes</ActionButton>\n </Group>\n </Stack>\n </form>\n </Card>\n </Flex>\n );\n};\n\nexport default AdminUserDetails;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as AdminUserDetails_default } from "./AdminUserDetails-C2y1Ig4n.js";
1
+ import { t as AdminUserDetails_default } from "./AdminUserDetails-DeTrJm-t.js";
2
2
 
3
3
  export { AdminUserDetails_default as default };
@@ -1,11 +1,11 @@
1
1
  import { ActionButton, Flex, Text } from "@alepha/ui";
2
2
  import { NestedView, useClient, useRouter, useRouterState } from "@alepha/react";
3
3
  import { IconDevices, IconSettings, IconUser } from "@tabler/icons-react";
4
- import { useEffect, useState } from "react";
5
- import { Avatar, Badge, Card, Group, Loader, Stack, Tabs } from "@mantine/core";
6
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Avatar, Badge, Card, Group, Loader, Stack, Tabs } from "@mantine/core";
6
+ import { useEffect, useState } from "react";
7
7
 
8
- //#region ../../src/admin/components/AdminUserLayout.tsx
8
+ //#region ../../src/admin/components/users/AdminUserLayout.tsx
9
9
  const AdminUserLayout = (props) => {
10
10
  const router = useRouter();
11
11
  const state = useRouterState();
@@ -102,7 +102,6 @@ const AdminUserLayout = (props) => {
102
102
  value: activeTab,
103
103
  children: /* @__PURE__ */ jsxs(Tabs.List, { children: [
104
104
  /* @__PURE__ */ jsx(ActionButton, {
105
- variant: "subtle",
106
105
  href: detailsPath,
107
106
  leftSection: /* @__PURE__ */ jsx(IconUser, { size: 16 }),
108
107
  c: activeTab === "details" ? void 0 : "dimmed",
@@ -114,7 +113,6 @@ const AdminUserLayout = (props) => {
114
113
  children: "Details"
115
114
  }),
116
115
  /* @__PURE__ */ jsx(ActionButton, {
117
- variant: "subtle",
118
116
  href: sessionsPath,
119
117
  leftSection: /* @__PURE__ */ jsx(IconDevices, { size: 16 }),
120
118
  c: activeTab === "sessions" ? void 0 : "dimmed",
@@ -126,7 +124,6 @@ const AdminUserLayout = (props) => {
126
124
  children: "Sessions"
127
125
  }),
128
126
  /* @__PURE__ */ jsx(ActionButton, {
129
- variant: "subtle",
130
127
  href: settingsPath,
131
128
  leftSection: /* @__PURE__ */ jsx(IconSettings, { size: 16 }),
132
129
  c: activeTab === "settings" ? void 0 : "dimmed",
@@ -150,4 +147,4 @@ var AdminUserLayout_default = AdminUserLayout;
150
147
 
151
148
  //#endregion
152
149
  export { AdminUserLayout_default as t };
153
- //# sourceMappingURL=AdminUserLayout-sW6cjZL0.js.map
150
+ //# sourceMappingURL=AdminUserLayout-CsfrrZkD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserLayout-CsfrrZkD.js","names":[],"sources":["../../src/admin/components/users/AdminUserLayout.tsx"],"sourcesContent":["import {\n NestedView,\n useClient,\n useRouter,\n useRouterState,\n} from \"@alepha/react\";\nimport { ActionButton, Flex, Text } from \"@alepha/ui\";\nimport { Avatar, Badge, Card, Group, Loader, Stack, Tabs } from \"@mantine/core\";\nimport { IconDevices, IconSettings, IconUser } from \"@tabler/icons-react\";\nimport type { UserController, UserEntity } from \"alepha/api/users\";\nimport { useEffect, useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminUserLayoutProps {\n userRealmName?: string;\n}\n\nconst AdminUserLayout = (props: AdminUserLayoutProps) => {\n const router = useRouter<AdminRouter>();\n const state = useRouterState();\n const client = useClient<UserController>();\n const userId = state.params.userId as string;\n\n const [user, setUser] = useState<UserEntity | null>(null);\n const [loading, setLoading] = useState(true);\n\n useEffect(() => {\n const loadUser = async () => {\n try {\n const data = await client.getUser({\n params: { id: userId },\n query: { userRealmName: props.userRealmName },\n });\n setUser(data);\n } finally {\n setLoading(false);\n }\n };\n\n loadUser();\n }, [userId]);\n\n if (loading) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Loader />\n </Flex>\n );\n }\n\n if (!user) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Text c=\"dimmed\">User not found</Text>\n </Flex>\n );\n }\n\n const currentPath = state.url.pathname;\n const detailsPath = router.path(\"adminUserDetails\", { params: { userId } });\n const sessionsPath = router.path(\"adminUserSessions\", { params: { userId } });\n const settingsPath = router.path(\"adminUserSettings\", { params: { userId } });\n\n const getActiveTab = () => {\n if (currentPath.endsWith(\"/sessions\")) return \"sessions\";\n if (currentPath.endsWith(\"/settings\")) return \"settings\";\n return \"details\";\n };\n const activeTab = getActiveTab();\n\n const displayName =\n user.firstName || user.lastName\n ? `${user.firstName ?? \"\"} ${user.lastName ?? \"\"}`.trim()\n : user.username || user.email || \"User\";\n\n return (\n <Flex flex={1} direction=\"column\" gap=\"md\" p=\"md\">\n <Card withBorder p=\"md\">\n <Group>\n <Avatar size=\"lg\" radius=\"xl\" color=\"blue\">\n {displayName.charAt(0).toUpperCase()}\n </Avatar>\n <Stack gap={4}>\n <Group gap=\"xs\">\n <Text size=\"lg\" fw={500}>\n {displayName}\n </Text>\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={user.enabled ? \"green\" : \"red\"}\n >\n {user.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n </Group>\n <Text size=\"sm\" c=\"dimmed\">\n {user.email || user.username || user.id}\n </Text>\n {user.roles.length > 0 && (\n <Group gap={4}>\n {user.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"outline\">\n {role}\n </Badge>\n ))}\n </Group>\n )}\n </Stack>\n </Group>\n </Card>\n\n <Tabs value={activeTab}>\n <Tabs.List>\n <ActionButton\n href={detailsPath}\n leftSection={<IconUser size={16} />}\n c={activeTab === \"details\" ? undefined : \"dimmed\"}\n fw={activeTab === \"details\" ? 500 : 400}\n style={{\n borderBottom:\n activeTab === \"details\"\n ? \"2px solid var(--mantine-primary-color-filled)\"\n : \"2px solid transparent\",\n borderRadius: 0,\n }}\n >\n Details\n </ActionButton>\n <ActionButton\n href={sessionsPath}\n leftSection={<IconDevices size={16} />}\n c={activeTab === \"sessions\" ? undefined : \"dimmed\"}\n fw={activeTab === \"sessions\" ? 500 : 400}\n style={{\n borderBottom:\n activeTab === \"sessions\"\n ? \"2px solid var(--mantine-primary-color-filled)\"\n : \"2px solid transparent\",\n borderRadius: 0,\n }}\n >\n Sessions\n </ActionButton>\n <ActionButton\n href={settingsPath}\n leftSection={<IconSettings size={16} />}\n c={activeTab === \"settings\" ? undefined : \"dimmed\"}\n fw={activeTab === \"settings\" ? 500 : 400}\n style={{\n borderBottom:\n activeTab === \"settings\"\n ? \"2px solid var(--mantine-primary-color-filled)\"\n : \"2px solid transparent\",\n borderRadius: 0,\n }}\n >\n Settings\n </ActionButton>\n </Tabs.List>\n </Tabs>\n\n <Flex flex={1}>\n <NestedView />\n </Flex>\n </Flex>\n );\n};\n\nexport default AdminUserLayout;\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import { t as AdminUserLayout_default } from "./AdminUserLayout-sW6cjZL0.js";
1
+ import { t as AdminUserLayout_default } from "./AdminUserLayout-CsfrrZkD.js";
2
2
 
3
3
  export { AdminUserLayout_default as default };
@@ -0,0 +1,3 @@
1
+ import { t as AdminUserSessions_default } from "./AdminUserSessions-DO9H85O-.js";
2
+
3
+ export { AdminUserSessions_default as default };
@@ -2,12 +2,12 @@ import { ActionButton, DataTable, Flex, Text } from "@alepha/ui";
2
2
  import { t } from "alepha";
3
3
  import { useClient, useRouterState } from "@alepha/react";
4
4
  import { IconDeviceDesktop, IconDeviceMobile, IconDeviceTablet, IconTrash } from "@tabler/icons-react";
5
- import { useState } from "react";
6
- import { Badge, Group } from "@mantine/core";
7
5
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
8
6
  import { useI18n } from "@alepha/react/i18n";
7
+ import { Badge, Group } from "@mantine/core";
8
+ import { useState } from "react";
9
9
 
10
- //#region ../../src/admin/components/AdminUserSessions.tsx
10
+ //#region ../../src/admin/components/users/AdminUserSessions.tsx
11
11
  const AdminUserSessions = (props) => {
12
12
  const state = useRouterState();
13
13
  const client = useClient();
@@ -126,4 +126,4 @@ var AdminUserSessions_default = AdminUserSessions;
126
126
 
127
127
  //#endregion
128
128
  export { AdminUserSessions_default as t };
129
- //# sourceMappingURL=AdminUserSessions-CvN15wPe.js.map
129
+ //# sourceMappingURL=AdminUserSessions-DO9H85O-.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserSessions-DO9H85O-.js","names":[],"sources":["../../src/admin/components/users/AdminUserSessions.tsx"],"sourcesContent":["import { useClient, useRouterState } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { ActionButton, DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Group } from \"@mantine/core\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport type { SessionController, SessionEntity } from \"alepha/api/users\";\nimport { useState } from \"react\";\n\nexport interface AdminUserSessionsProps {\n userRealmName?: string;\n}\n\nconst AdminUserSessions = (props: AdminUserSessionsProps) => {\n const state = useRouterState();\n const client = useClient<SessionController>();\n const { l } = useI18n();\n const userId = state.params.userId as string;\n const [refreshKey, setRefreshKey] = useState(0);\n\n const getDeviceIcon = (device?: string) => {\n switch (device) {\n case \"MOBILE\":\n return <IconDeviceMobile size={14} />;\n case \"TABLET\":\n return <IconDeviceTablet size={14} />;\n default:\n return <IconDeviceDesktop size={14} />;\n }\n };\n\n const isExpired = (expiresAt: Date | string) => {\n return new Date(expiresAt) < new Date();\n };\n\n const handleDelete = async (sessionId: string) => {\n await client.deleteSession({\n params: { id: sessionId },\n query: { userRealmName: props.userRealmName },\n });\n setRefreshKey((k) => k + 1);\n };\n\n const filters = t.object({});\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<SessionEntity, typeof filters>\n key={refreshKey}\n submitOnInit\n defaultSize={10}\n filters={filters}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n tableTrProps={(item) => {\n if (isExpired(item.expiresAt)) {\n return {\n opacity: 0.5,\n };\n }\n return {};\n }}\n items={async (filters) => {\n const response = await client.findSessions({\n query: {\n ...filters,\n userId,\n userRealmName: props.userRealmName,\n },\n });\n\n return response as Page<SessionEntity>;\n }}\n columns={{\n userAgent: {\n label: \"Device\",\n value: (item) => (\n <Group gap={4}>\n {item.userAgent ? (\n <>\n <Badge\n size=\"xs\"\n variant=\"light\"\n leftSection={getDeviceIcon(item.userAgent.device)}\n >\n {item.userAgent.device}\n </Badge>\n <Text size=\"xs\" c=\"dimmed\">\n {item.userAgent.browser} / {item.userAgent.os}\n </Text>\n </>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n )}\n </Group>\n ),\n },\n ip: {\n label: \"IP Address\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" ff=\"monospace\" c=\"dimmed\">\n {item.ip || \"-\"}\n </Text>\n ),\n },\n expiresAt: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={isExpired(item.expiresAt) ? \"red\" : \"green\"}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n actions: {\n label: \"\",\n fit: true,\n value: (item) => (\n <ActionButton\n size=\"xs\"\n variant=\"subtle\"\n color=\"red\"\n onClick={() => handleDelete(item.id)}\n >\n <IconTrash size={14} />\n </ActionButton>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminUserSessions;\n"],"mappings":";;;;;;;;;;AAkBA,MAAM,qBAAqB,UAAkC;CAC3D,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,SAAS,WAA8B;CAC7C,MAAM,EAAE,MAAM,SAAS;CACvB,MAAM,SAAS,MAAM,OAAO;CAC5B,MAAM,CAAC,YAAY,iBAAiB,SAAS,EAAE;CAE/C,MAAM,iBAAiB,WAAoB;AACzC,UAAQ,QAAR;GACE,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;GACvC,KAAK,SACH,QAAO,oBAAC,oBAAiB,MAAM,KAAM;GACvC,QACE,QAAO,oBAAC,qBAAkB,MAAM,KAAM;;;CAI5C,MAAM,aAAa,cAA6B;AAC9C,SAAO,IAAI,KAAK,UAAU,mBAAG,IAAI,MAAM;;CAGzC,MAAM,eAAe,OAAO,cAAsB;AAChD,QAAM,OAAO,cAAc;GACzB,QAAQ,EAAE,IAAI,WAAW;GACzB,OAAO,EAAE,eAAe,MAAM,eAAe;GAC9C,CAAC;AACF,iBAAe,MAAM,IAAI,EAAE;;AAK7B,QACE,oBAAC;EAAK,MAAM;EAAG,WAAU;YACvB,oBAAC;GAEC;GACA,aAAa;GACb,SARU,EAAE,OAAO,EAAE,CAAC;GAStB,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,eAAe,SAAS;AACtB,QAAI,UAAU,KAAK,UAAU,CAC3B,QAAO,EACL,SAAS,IACV;AAEH,WAAO,EAAE;;GAEX,OAAO,OAAO,YAAY;AASxB,WARiB,MAAM,OAAO,aAAa,EACzC,OAAO;KACL,GAAG;KACH;KACA,eAAe,MAAM;KACtB,EACF,CAAC;;GAIJ,SAAS;IACP,WAAW;KACT,OAAO;KACP,QAAQ,SACN,oBAAC;MAAM,KAAK;gBACT,KAAK,YACJ,4CACE,oBAAC;OACC,MAAK;OACL,SAAQ;OACR,aAAa,cAAc,KAAK,UAAU,OAAO;iBAEhD,KAAK,UAAU;QACV,EACR,qBAAC;OAAK,MAAK;OAAK,GAAE;;QACf,KAAK,UAAU;QAAQ;QAAI,KAAK,UAAU;;QACtC,IACN,GAEH,oBAAC;OAAK,MAAK;OAAK,GAAE;iBAAS;QAEpB;OAEH;KAEX;IACD,IAAI;KACF,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAG;MAAY,GAAE;gBAC9B,KAAK,MAAM;OACP;KAEV;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,UAAU,KAAK,UAAU,GAAG,QAAQ;gBAE1C,UAAU,KAAK,UAAU,GAAG,YAAY;OACnC;KAEX;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACD,SAAS;KACP,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAM;MACN,eAAe,aAAa,KAAK,GAAG;gBAEpC,oBAAC,aAAU,MAAM,KAAM;OACV;KAElB;IACF;KAlGI,WAmGL;GACG;;AAIX,gCAAe"}
@@ -1,11 +1,11 @@
1
1
  import { ActionButton, Flex, Text } from "@alepha/ui";
2
2
  import { useClient, useRouter, useRouterState } from "@alepha/react";
3
3
  import { IconAlertCircle, IconCheck, IconMail, IconTrash } from "@tabler/icons-react";
4
- import { useEffect, useState } from "react";
5
- import { Alert, Card, Group, Loader, Stack } from "@mantine/core";
6
4
  import { jsx, jsxs } from "react/jsx-runtime";
5
+ import { Alert, Card, Group, Loader, Stack } from "@mantine/core";
6
+ import { useEffect, useState } from "react";
7
7
 
8
- //#region ../../src/admin/components/AdminUserSettings.tsx
8
+ //#region ../../src/admin/components/users/AdminUserSettings.tsx
9
9
  const AdminUserSettings = (props) => {
10
10
  const router = useRouter();
11
11
  const state = useRouterState();
@@ -161,4 +161,4 @@ var AdminUserSettings_default = AdminUserSettings;
161
161
 
162
162
  //#endregion
163
163
  export { AdminUserSettings_default as t };
164
- //# sourceMappingURL=AdminUserSettings-DvaaxgcV.js.map
164
+ //# sourceMappingURL=AdminUserSettings-B3jA8g3p.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUserSettings-B3jA8g3p.js","names":[],"sources":["../../src/admin/components/users/AdminUserSettings.tsx"],"sourcesContent":["import { useClient, useRouter, useRouterState } from \"@alepha/react\";\nimport { ActionButton, Flex, Text } from \"@alepha/ui\";\nimport { Alert, Card, Group, Loader, Stack } from \"@mantine/core\";\nimport {\n IconAlertCircle,\n IconCheck,\n IconMail,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport type { UserController, UserEntity } from \"alepha/api/users\";\nimport { useEffect, useState } from \"react\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminUserSettingsProps {\n userRealmName?: string;\n}\n\nconst AdminUserSettings = (props: AdminUserSettingsProps) => {\n const router = useRouter<AdminRouter>();\n const state = useRouterState();\n const client = useClient<UserController>();\n const userId = state.params.userId as string;\n\n const [user, setUser] = useState<UserEntity | null>(null);\n const [loading, setLoading] = useState(true);\n const [deleteLoading, setDeleteLoading] = useState(false);\n const [verifyLoading, setVerifyLoading] = useState(false);\n const [verifySuccess, setVerifySuccess] = useState(false);\n\n useEffect(() => {\n const loadUser = async () => {\n try {\n const data = await client.getUser({\n params: { id: userId },\n query: { userRealmName: props.userRealmName },\n });\n setUser(data);\n } finally {\n setLoading(false);\n }\n };\n\n loadUser();\n }, [userId]);\n\n const handleDelete = async () => {\n if (!confirm(\"Are you sure you want to delete this user?\")) {\n return;\n }\n\n setDeleteLoading(true);\n try {\n await client.deleteUser({\n params: { id: userId },\n query: { userRealmName: props.userRealmName },\n });\n await router.go(\"adminUsers\");\n } finally {\n setDeleteLoading(false);\n }\n };\n\n const handleTriggerEmailVerification = async () => {\n if (!user?.email) return;\n\n setVerifyLoading(true);\n setVerifySuccess(false);\n try {\n await client.requestEmailVerification({\n query: {\n userRealmName: props.userRealmName,\n method: \"link\",\n verifyUrl: `${window.location.origin}/verify-email`,\n },\n body: { email: user.email },\n });\n setVerifySuccess(true);\n } finally {\n setVerifyLoading(false);\n }\n };\n\n if (loading) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Loader />\n </Flex>\n );\n }\n\n if (!user) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Text c=\"dimmed\">User not found</Text>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} direction=\"column\" gap=\"md\">\n {user.email && !user.emailVerified && (\n <Card withBorder p=\"lg\">\n <Stack gap=\"md\">\n <Text size=\"lg\" fw={500}>\n Email Verification\n </Text>\n\n <Alert variant=\"light\" color=\"yellow\" icon={<IconMail />}>\n <Text size=\"sm\">\n This user's email ({user.email}) is not verified. You can send a\n verification link to the user.\n </Text>\n </Alert>\n\n {verifySuccess && (\n <Alert variant=\"light\" color=\"green\" icon={<IconCheck />}>\n <Text size=\"sm\">\n Verification link sent successfully to {user.email}.\n </Text>\n </Alert>\n )}\n\n <Group>\n <ActionButton\n leftSection={<IconMail size={16} />}\n loading={verifyLoading}\n onClick={handleTriggerEmailVerification}\n >\n Send Verification Link\n </ActionButton>\n </Group>\n </Stack>\n </Card>\n )}\n\n <Card withBorder p=\"lg\">\n <Stack gap=\"md\">\n <Text size=\"lg\" fw={500} c=\"red\">\n Danger Zone\n </Text>\n\n <Alert variant=\"light\" color=\"red\" icon={<IconAlertCircle />}>\n <Text size=\"sm\">\n Deleting this user will permanently remove their account and all\n associated data. This action cannot be undone.\n </Text>\n </Alert>\n\n <Group>\n <ActionButton\n color=\"red\"\n leftSection={<IconTrash size={16} />}\n loading={deleteLoading}\n onClick={handleDelete}\n >\n Delete User\n </ActionButton>\n </Group>\n </Stack>\n </Card>\n </Flex>\n );\n};\n\nexport default AdminUserSettings;\n"],"mappings":";;;;;;;;AAiBA,MAAM,qBAAqB,UAAkC;CAC3D,MAAM,SAAS,WAAwB;CACvC,MAAM,QAAQ,gBAAgB;CAC9B,MAAM,SAAS,WAA2B;CAC1C,MAAM,SAAS,MAAM,OAAO;CAE5B,MAAM,CAAC,MAAM,WAAW,SAA4B,KAAK;CACzD,MAAM,CAAC,SAAS,cAAc,SAAS,KAAK;CAC5C,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;AAEzD,iBAAgB;EACd,MAAM,WAAW,YAAY;AAC3B,OAAI;AAKF,YAJa,MAAM,OAAO,QAAQ;KAChC,QAAQ,EAAE,IAAI,QAAQ;KACtB,OAAO,EAAE,eAAe,MAAM,eAAe;KAC9C,CAAC,CACW;aACL;AACR,eAAW,MAAM;;;AAIrB,YAAU;IACT,CAAC,OAAO,CAAC;CAEZ,MAAM,eAAe,YAAY;AAC/B,MAAI,CAAC,QAAQ,6CAA6C,CACxD;AAGF,mBAAiB,KAAK;AACtB,MAAI;AACF,SAAM,OAAO,WAAW;IACtB,QAAQ,EAAE,IAAI,QAAQ;IACtB,OAAO,EAAE,eAAe,MAAM,eAAe;IAC9C,CAAC;AACF,SAAM,OAAO,GAAG,aAAa;YACrB;AACR,oBAAiB,MAAM;;;CAI3B,MAAM,iCAAiC,YAAY;AACjD,MAAI,CAAC,MAAM,MAAO;AAElB,mBAAiB,KAAK;AACtB,mBAAiB,MAAM;AACvB,MAAI;AACF,SAAM,OAAO,yBAAyB;IACpC,OAAO;KACL,eAAe,MAAM;KACrB,QAAQ;KACR,WAAW,GAAG,OAAO,SAAS,OAAO;KACtC;IACD,MAAM,EAAE,OAAO,KAAK,OAAO;IAC5B,CAAC;AACF,oBAAiB,KAAK;YACd;AACR,oBAAiB,MAAM;;;AAI3B,KAAI,QACF,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,oBAAC,WAAS;GACL;AAIX,KAAI,CAAC,KACH,QACE,oBAAC;EAAK,MAAM;EAAG,SAAQ;EAAS,OAAM;YACpC,oBAAC;GAAK,GAAE;aAAS;IAAqB;GACjC;AAIX,QACE,qBAAC;EAAK,MAAM;EAAG,WAAU;EAAS,KAAI;aACnC,KAAK,SAAS,CAAC,KAAK,iBACnB,oBAAC;GAAK;GAAW,GAAE;aACjB,qBAAC;IAAM,KAAI;;KACT,oBAAC;MAAK,MAAK;MAAK,IAAI;gBAAK;OAElB;KAEP,oBAAC;MAAM,SAAQ;MAAQ,OAAM;MAAS,MAAM,oBAAC,aAAW;gBACtD,qBAAC;OAAK,MAAK;;QAAK;QACM,KAAK;QAAM;;QAE1B;OACD;KAEP,iBACC,oBAAC;MAAM,SAAQ;MAAQ,OAAM;MAAQ,MAAM,oBAAC,cAAY;gBACtD,qBAAC;OAAK,MAAK;;QAAK;QAC0B,KAAK;QAAM;;QAC9C;OACD;KAGV,oBAAC,mBACC,oBAAC;MACC,aAAa,oBAAC,YAAS,MAAM,KAAM;MACnC,SAAS;MACT,SAAS;gBACV;OAEc,GACT;;KACF;IACH,EAGT,oBAAC;GAAK;GAAW,GAAE;aACjB,qBAAC;IAAM,KAAI;;KACT,oBAAC;MAAK,MAAK;MAAK,IAAI;MAAK,GAAE;gBAAM;OAE1B;KAEP,oBAAC;MAAM,SAAQ;MAAQ,OAAM;MAAM,MAAM,oBAAC,oBAAkB;gBAC1D,oBAAC;OAAK,MAAK;iBAAK;QAGT;OACD;KAER,oBAAC,mBACC,oBAAC;MACC,OAAM;MACN,aAAa,oBAAC,aAAU,MAAM,KAAM;MACpC,SAAS;MACT,SAAS;gBACV;OAEc,GACT;;KACF;IACH;GACF;;AAIX,gCAAe"}
@@ -0,0 +1,3 @@
1
+ import { t as AdminUserSettings_default } from "./AdminUserSettings-B3jA8g3p.js";
2
+
3
+ export { AdminUserSettings_default as default };
@@ -0,0 +1,3 @@
1
+ import { t as AdminUsers_default } from "./AdminUsers-ebbrJBT0.js";
2
+
3
+ export { AdminUsers_default as default };
@@ -1,32 +1,28 @@
1
- import { ActionButton, DataTable, Text } from "@alepha/ui";
1
+ import { DataTable, Text } from "@alepha/ui";
2
2
  import { t } from "alepha";
3
3
  import { useClient, useRouter } from "@alepha/react";
4
- import { IconCheck, IconPlus, IconX } from "@tabler/icons-react";
5
- import { Badge, Flex as Flex$1, Group } from "@mantine/core";
4
+ import { IconCheck, IconUsersPlus, IconX } from "@tabler/icons-react";
6
5
  import { jsx, jsxs } from "react/jsx-runtime";
7
6
  import { useI18n } from "@alepha/react/i18n";
7
+ import { Badge, Flex as Flex$1, Group } from "@mantine/core";
8
8
  import { users } from "alepha/api/users";
9
9
 
10
- //#region ../../src/admin/components/AdminUsers.tsx
10
+ //#region ../../src/admin/components/users/AdminUsers.tsx
11
11
  const AdminUsers = (props) => {
12
12
  const client = useClient();
13
13
  const router = useRouter();
14
14
  const { l } = useI18n();
15
15
  const filters = t.object({ query: t.optional(t.string({ $control: { query: t.omit(users.schema, ["id", "version"]) } })) });
16
- return /* @__PURE__ */ jsxs(Flex$1, {
16
+ return /* @__PURE__ */ jsx(Flex$1, {
17
17
  flex: 1,
18
18
  direction: "column",
19
- children: [/* @__PURE__ */ jsx(Flex$1, {
20
- justify: "flex-end",
21
- p: "md",
22
- pb: 0,
23
- children: /* @__PURE__ */ jsx(ActionButton, {
24
- leftSection: /* @__PURE__ */ jsx(IconPlus, { size: 16 }),
25
- href: router.path("adminUserCreate"),
26
- children: "Create User"
27
- })
28
- }), /* @__PURE__ */ jsx(DataTable, {
19
+ children: /* @__PURE__ */ jsx(DataTable, {
29
20
  submitOnInit: true,
21
+ actions: [{
22
+ icon: IconUsersPlus,
23
+ href: router.path("adminUserCreate"),
24
+ label: "Create User"
25
+ }],
30
26
  defaultSize: 10,
31
27
  typeFormProps: {
32
28
  skipSubmitButton: true,
@@ -112,11 +108,11 @@ const AdminUsers = (props) => {
112
108
  })
113
109
  }
114
110
  }
115
- })]
111
+ })
116
112
  });
117
113
  };
118
114
  var AdminUsers_default = AdminUsers;
119
115
 
120
116
  //#endregion
121
117
  export { AdminUsers_default as t };
122
- //# sourceMappingURL=AdminUsers-BR3C-jrg.js.map
118
+ //# sourceMappingURL=AdminUsers-ebbrJBT0.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminUsers-ebbrJBT0.js","names":["Flex","baseProps: Record<string, any>","filters"],"sources":["../../src/admin/components/users/AdminUsers.tsx"],"sourcesContent":["import { useClient, useRouter } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Text } from \"@alepha/ui\";\nimport { Badge, Flex, Group } from \"@mantine/core\";\nimport { IconCheck, IconUsersPlus, IconX } from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport { type UserController, type UserEntity, users } from \"alepha/api/users\";\nimport type { AdminRouter } from \"../../AdminRouter.ts\";\n\nexport interface AdminUsersProps {\n userRealmName?: string;\n}\n\nconst AdminUsers = (props: AdminUsersProps) => {\n const client = useClient<UserController>();\n const router = useRouter<AdminRouter>();\n const { l } = useI18n();\n\n const filters = t.object({\n query: t.optional(\n t.string({\n $control: {\n query: t.omit(users.schema, [\"id\", \"version\"]),\n },\n }),\n ),\n });\n\n return (\n <Flex flex={1} direction=\"column\">\n <DataTable<UserEntity, typeof filters>\n submitOnInit\n actions={[\n {\n icon: IconUsersPlus,\n href: router.path(\"adminUserCreate\"),\n label: \"Create User\",\n },\n ]}\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n striped: false,\n highlightOnHover: true,\n }}\n onFilterChange={(key, value, form) => {\n if (key === \"query\") {\n return form.submit();\n }\n }}\n filters={filters}\n tableTrProps={(item) => {\n const baseProps: Record<string, any> = {\n style: { cursor: \"pointer\" },\n onClick: () =>\n router.go(\"adminUserDetails\", {\n params: { userId: item.id },\n }),\n };\n\n if (!item.enabled) {\n baseProps.opacity = 0.5;\n }\n\n return baseProps;\n }}\n items={async (filters) => {\n const response = await client.findUsers({\n query: {\n ...filters,\n userRealmName: props.userRealmName,\n },\n });\n\n return response as Page<UserEntity>;\n }}\n columns={{\n username: {\n label: \"Username\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.username || \"-\"}\n </Text>\n ),\n },\n email: {\n label: \"Email\",\n value: (item) => (\n <Group gap=\"xs\">\n <Text size=\"sm\">{item.email || \"-\"}</Text>\n {item.email && (\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={item.emailVerified ? \"green\" : \"gray\"}\n leftSection={\n item.emailVerified ? (\n <IconCheck size={10} />\n ) : (\n <IconX size={10} />\n )\n }\n >\n {item.emailVerified ? \"Verified\" : \"Unverified\"}\n </Badge>\n )}\n </Group>\n ),\n },\n roles: {\n label: \"Roles\",\n value: (item) => (\n <Group gap={4}>\n {item.roles.map((role: string) => (\n <Badge key={role} size=\"xs\" variant=\"outline\">\n {role}\n </Badge>\n ))}\n </Group>\n ),\n },\n enabled: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={item.enabled ? \"green\" : \"red\"}\n >\n {item.enabled ? \"Active\" : \"Disabled\"}\n </Badge>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminUsers;\n"],"mappings":";;;;;;;;;;AAaA,MAAM,cAAc,UAA2B;CAC7C,MAAM,SAAS,WAA2B;CAC1C,MAAM,SAAS,WAAwB;CACvC,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO,EACvB,OAAO,EAAE,SACP,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,MAAM,QAAQ,CAAC,MAAM,UAAU,CAAC,EAC/C,EACF,CAAC,CACH,EACF,CAAC;AAEF,QACE,oBAACA;EAAK,MAAM;EAAG,WAAU;YACvB,oBAAC;GACC;GACA,SAAS,CACP;IACE,MAAM;IACN,MAAM,OAAO,KAAK,kBAAkB;IACpC,OAAO;IACR,CACF;GACD,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IACjB,SAAS;IACT,kBAAkB;IACnB;GACD,iBAAiB,KAAK,OAAO,SAAS;AACpC,QAAI,QAAQ,QACV,QAAO,KAAK,QAAQ;;GAGf;GACT,eAAe,SAAS;IACtB,MAAMC,YAAiC;KACrC,OAAO,EAAE,QAAQ,WAAW;KAC5B,eACE,OAAO,GAAG,oBAAoB,EAC5B,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC5B,CAAC;KACL;AAED,QAAI,CAAC,KAAK,QACR,WAAU,UAAU;AAGtB,WAAO;;GAET,OAAO,OAAO,cAAY;AAQxB,WAPiB,MAAM,OAAO,UAAU,EACtC,OAAO;KACL,GAAGC;KACH,eAAe,MAAM;KACtB,EACF,CAAC;;GAIJ,SAAS;IACP,UAAU;KACR,OAAO;KACP,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,IAAI;gBACjB,KAAK,YAAY;OACb;KAEV;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,qBAAC;MAAM,KAAI;iBACT,oBAAC;OAAK,MAAK;iBAAM,KAAK,SAAS;QAAW,EACzC,KAAK,SACJ,oBAAC;OACC,MAAK;OACL,SAAQ;OACR,OAAO,KAAK,gBAAgB,UAAU;OACtC,aACE,KAAK,gBACH,oBAAC,aAAU,MAAM,KAAM,GAEvB,oBAAC,SAAM,MAAM,KAAM;iBAItB,KAAK,gBAAgB,aAAa;QAC7B;OAEJ;KAEX;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,oBAAC;MAAM,KAAK;gBACT,KAAK,MAAM,KAAK,SACf,oBAAC;OAAiB,MAAK;OAAK,SAAQ;iBACjC;SADS,KAEJ,CACR;OACI;KAEX;IACD,SAAS;KACP,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,KAAK,UAAU,UAAU;gBAE/B,KAAK,UAAU,WAAW;OACrB;KAEX;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,yBAAe"}