@alepha/ui 0.17.2 → 0.18.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-CF_qOO3u.js → AdminApiKeys-C-6_Q-lH.js} +56 -192
- package/dist/admin/AdminApiKeys-C-6_Q-lH.js.map +1 -0
- package/dist/admin/{AdminAudits-BQno3hZG.js → AdminAudits-Bgbf04hO.js} +25 -61
- package/dist/admin/AdminAudits-Bgbf04hO.js.map +1 -0
- package/dist/admin/{AdminFiles-kvuUaASF.js → AdminFiles-B9a7G3cY.js} +6 -8
- package/dist/admin/AdminFiles-B9a7G3cY.js.map +1 -0
- package/dist/admin/{AdminJobDashboard-CrPxp0W1.js → AdminJobDashboard-DaTwf5OY.js} +55 -186
- package/dist/admin/AdminJobDashboard-DaTwf5OY.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D-b4Zt7W.js → AdminJobExecutions-B9cek5dl.js} +132 -168
- package/dist/admin/AdminJobExecutions-B9cek5dl.js.map +1 -0
- package/dist/admin/{AdminJobRegistry-CNX5cpDx.js → AdminJobRegistry-DFgV3oqx.js} +60 -83
- package/dist/admin/AdminJobRegistry-DFgV3oqx.js.map +1 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js +70 -0
- package/dist/admin/AdminLayout-DHsvWxVB.js.map +1 -0
- package/dist/admin/{AdminParameters-DCGbpt2c.js → AdminParameters-DHw9ATgl.js} +53 -53
- package/dist/admin/AdminParameters-DHw9ATgl.js.map +1 -0
- package/dist/admin/{AdminSessions-DyhW6RZv.js → AdminSessions-BhGJPI3z.js} +11 -18
- package/dist/admin/AdminSessions-BhGJPI3z.js.map +1 -0
- package/dist/admin/{AdminUserLayout-CrBj4UuI.js → AdminUserLayout-BdC4Te8m.js} +112 -151
- package/dist/admin/AdminUserLayout-BdC4Te8m.js.map +1 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js +69 -0
- package/dist/admin/AdminUserProfile-DAt23fqY.js.map +1 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js +109 -0
- package/dist/admin/AdminUserSessions-1uzcx02z.js.map +1 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js +121 -0
- package/dist/admin/AdminUsers-C85c3eiQ.js.map +1 -0
- package/dist/{auth/AuthLayout-CdJcrPs4.js → admin/AuthLayout-DFJvCvzw.js} +3 -3
- package/dist/{auth/AuthLayout-CdJcrPs4.js.map → admin/AuthLayout-DFJvCvzw.js.map} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js → admin/IconGoogle-CSQLPYwX.js} +1 -1
- package/dist/{auth/IconGoogle-Bm18QD2q.js.map → admin/IconGoogle-CSQLPYwX.js.map} +1 -1
- package/dist/{demo/DemoLogin-DjJ9314c.js → admin/Login-BGheURrg.js} +15 -129
- package/dist/{auth/Login-BS_FYTy0.js.map → admin/Login-BGheURrg.js.map} +1 -1
- package/dist/{auth/Profile-CjDsW378.js → admin/Profile-B-c9pCPf.js} +5 -5
- package/dist/{auth/Profile-CjDsW378.js.map → admin/Profile-B-c9pCPf.js.map} +1 -1
- package/dist/{demo/DemoRegister-DzkJ5M83.js → admin/Register-Cs10l8vX.js} +20 -146
- package/dist/{auth/Register-C5eqzAaD.js.map → admin/Register-Cs10l8vX.js.map} +1 -1
- package/dist/{demo/DemoResetPassword-DWh4_BpQ.js → admin/ResetPassword-BwDdfkGH.js} +20 -82
- package/dist/{auth/ResetPassword-XifinVao.js.map → admin/ResetPassword-BwDdfkGH.js.map} +1 -1
- package/dist/{demo/DemoVerifyEmail-DbU_tCj8.js → admin/VerifyEmail-DfXHAiQl.js} +15 -32
- package/dist/{auth/VerifyEmail-DTgbeJOO.js.map → admin/VerifyEmail-DfXHAiQl.js.map} +1 -1
- package/dist/admin/auth-Dr0Cf8I7.js +319 -0
- package/dist/admin/auth-Dr0Cf8I7.js.map +1 -0
- package/dist/admin/core-2xoLiT0o.js +4031 -0
- package/dist/admin/core-2xoLiT0o.js.map +1 -0
- package/dist/admin/index.d.ts +739 -13
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +79 -111
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +18 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js +22 -0
- package/dist/auth/AuthLayout-CAE1pX9s.js.map +1 -0
- package/dist/auth/{Login-BS_FYTy0.js → Login-Denw_UGy.js} +8 -8
- package/dist/auth/Login-Denw_UGy.js.map +1 -0
- package/dist/auth/Profile-BMX_Ar_s.js +155 -0
- package/dist/auth/Profile-BMX_Ar_s.js.map +1 -0
- package/dist/auth/{Register-C5eqzAaD.js → Register-6hi_cpfF.js} +8 -8
- package/dist/auth/Register-6hi_cpfF.js.map +1 -0
- package/dist/auth/{ResetPassword-XifinVao.js → ResetPassword-CqfTk1FI.js} +6 -6
- package/dist/auth/ResetPassword-CqfTk1FI.js.map +1 -0
- package/dist/auth/{VerifyEmail-DTgbeJOO.js → VerifyEmail-nWiSTMjF.js} +5 -5
- package/dist/auth/VerifyEmail-nWiSTMjF.js.map +1 -0
- package/dist/auth/core-niW0sFLv.js +2264 -0
- package/dist/auth/core-niW0sFLv.js.map +1 -0
- package/dist/auth/index.d.ts +336 -8
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +18 -22
- package/dist/auth/index.js.map +1 -1
- package/dist/core/index.d.ts +1033 -843
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +1626 -1354
- package/dist/core/index.js.map +1 -1
- package/dist/demo/AuthLayout-jLa0aKsI.js +22 -0
- package/dist/demo/AuthLayout-jLa0aKsI.js.map +1 -0
- package/dist/demo/DemoButton-BmaWZVwf.js +178 -0
- package/dist/demo/DemoButton-BmaWZVwf.js.map +1 -0
- package/dist/demo/{DemoDataTable-lnBKWBf8.js → DemoDataTable-Z9xyV221.js} +18 -18
- package/dist/demo/DemoDataTable-Z9xyV221.js.map +1 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js +101 -0
- package/dist/demo/DemoDialog-4ItHLf9t.js.map +1 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js +105 -0
- package/dist/demo/DemoFlex-EtVq8QfX.js.map +1 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js +18 -0
- package/dist/demo/DemoHeading-BS-vGfkI.js.map +1 -0
- package/dist/demo/{DemoHome-CUMZsYaH.js → DemoHome-Clbn8AmS.js} +9 -12
- package/dist/demo/DemoHome-Clbn8AmS.js.map +1 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js +109 -0
- package/dist/demo/DemoJsonViewer-DkIX_ky2.js.map +1 -0
- package/dist/demo/DemoLayout-C56xb5EE.js +73 -0
- package/dist/demo/DemoLayout-C56xb5EE.js.map +1 -0
- package/dist/demo/DemoLogin-BZwpicOS.js +128 -0
- package/dist/demo/DemoLogin-BZwpicOS.js.map +1 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js +140 -0
- package/dist/demo/DemoRegister-C7_qc4MJ.js.map +1 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js +76 -0
- package/dist/demo/DemoResetPassword-BI1Ct4Dw.js.map +1 -0
- package/dist/demo/{DemoSidebar-C1csnGhX.js → DemoSidebar-CcBo4ltC.js} +6 -9
- package/dist/demo/DemoSidebar-CcBo4ltC.js.map +1 -0
- package/dist/demo/DemoText-CzXuUn3g.js +124 -0
- package/dist/demo/DemoText-CzXuUn3g.js.map +1 -0
- package/dist/demo/DemoToast-BgHDhWrX.js +95 -0
- package/dist/demo/DemoToast-BgHDhWrX.js.map +1 -0
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js → DemoTypeForm-DDzWoMSV.js} +4 -4
- package/dist/demo/{DemoTypeForm-CWz6fJrJ.js.map → DemoTypeForm-DDzWoMSV.js.map} +1 -1
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js +30 -0
- package/dist/demo/DemoVerifyEmail-C_Irdnov.js.map +1 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js +56 -0
- package/dist/demo/IconGoogle-CSQLPYwX.js.map +1 -0
- package/dist/demo/Login-hSOU3jZc.js +219 -0
- package/dist/demo/Login-hSOU3jZc.js.map +1 -0
- package/dist/demo/Profile-CWqti7FB.js +155 -0
- package/dist/demo/Profile-CWqti7FB.js.map +1 -0
- package/dist/demo/Register-a70LPgs2.js +375 -0
- package/dist/demo/Register-a70LPgs2.js.map +1 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js +286 -0
- package/dist/demo/ResetPassword-DWN0lzr5.js.map +1 -0
- package/dist/demo/Showcase-Dq3MISpd.js +232 -0
- package/dist/demo/Showcase-Dq3MISpd.js.map +1 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js +135 -0
- package/dist/demo/VerifyEmail-DZWL72K4.js.map +1 -0
- package/dist/demo/auth-d6n3xbug.js +257 -0
- package/dist/demo/auth-d6n3xbug.js.map +1 -0
- package/dist/demo/core-RCUw1Q-a.js +4217 -0
- package/dist/demo/core-RCUw1Q-a.js.map +1 -0
- package/dist/demo/index.d.ts +17 -6
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +92 -24
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +18 -0
- package/package.json +16 -20
- package/src/admin/AdminRouter.ts +10 -39
- package/src/admin/components/AdminLayout.tsx +42 -10
- package/src/admin/components/audits/AdminAudits.tsx +10 -64
- package/src/admin/components/files/AdminFiles.tsx +2 -3
- package/src/admin/components/jobs/AdminJobDashboard.tsx +36 -142
- package/src/admin/components/jobs/AdminJobExecutions.tsx +117 -175
- package/src/admin/components/jobs/AdminJobRegistry.tsx +58 -73
- package/src/admin/components/keys/AdminApiKeys.tsx +21 -169
- package/src/admin/components/parameters/AdminParameters.tsx +4 -4
- package/src/admin/components/parameters/ParameterEmptyState.tsx +1 -2
- package/src/admin/components/parameters/ParameterHistory.tsx +3 -3
- package/src/admin/components/parameters/ParameterTree.tsx +2 -8
- package/src/admin/components/parameters/types.ts +3 -3
- package/src/admin/components/sessions/AdminSessions.tsx +8 -16
- package/src/admin/components/users/AdminUserLayout.tsx +113 -150
- package/src/admin/components/users/AdminUserProfile.tsx +50 -0
- package/src/admin/components/users/AdminUserSessions.tsx +106 -126
- package/src/admin/components/users/AdminUsers.tsx +46 -62
- package/src/admin/index.ts +0 -4
- package/src/auth/components/buttons/UserButton.tsx +1 -1
- package/src/auth/index.ts +0 -4
- package/src/core/UiRouter.ts +1 -1
- package/src/core/atoms/alephaSidebarAtom.ts +7 -31
- package/src/core/components/{layout/AlephaMantineProvider.tsx → AlephaMantineProvider.tsx} +3 -4
- package/src/core/components/Flex.tsx +63 -0
- package/src/core/components/Heading.tsx +19 -0
- package/src/core/components/Text.tsx +140 -0
- package/src/core/components/buttons/ActionButton.tsx +12 -1
- package/src/core/components/buttons/BurgerButton.tsx +3 -3
- package/src/core/components/buttons/LanguageButton.tsx +1 -1
- package/src/core/components/buttons/ToggleSidebarButton.tsx +1 -4
- package/src/core/components/data/DetailDrawer.tsx +144 -0
- package/src/core/components/data/DetailList.tsx +64 -0
- package/src/core/components/data/StatCards.tsx +50 -0
- package/src/core/components/layout/AppBar.tsx +11 -10
- package/src/core/components/layout/Breadcrumb.tsx +8 -8
- package/src/core/components/layout/Container.tsx +15 -0
- package/src/core/components/layout/DashboardShell.tsx +23 -238
- package/src/core/components/layout/Omnibar.tsx +1 -2
- package/src/core/components/layout/Sidebar.tsx +103 -71
- package/src/core/components/layout/index.ts +65 -0
- package/src/core/{components/form → form/components}/Control.tsx +32 -14
- package/src/core/{components/form → form/components}/ControlArray.tsx +2 -5
- package/src/core/{components/form → form/components}/ControlDate.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlNumber.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlObject.tsx +1 -4
- package/src/core/{components/form → form/components}/ControlQueryBuilder.tsx +7 -7
- package/src/core/{components/form → form/components}/ControlSelect.tsx +2 -4
- package/src/core/{components/form → form/components}/TypeForm.browser.spec.tsx +22 -64
- package/src/core/{components/form → form/components}/TypeForm.tsx +1 -3
- package/src/core/form/factories/dialogForm.tsx +31 -0
- package/src/core/form/index.ts +23 -0
- package/src/core/{utils → form/utils}/parseInput.ts +2 -4
- package/src/core/index.ts +43 -51
- package/src/core/interfaces/AlephaIntent.ts +6 -0
- package/src/core/interfaces/AlephaTheme.ts +0 -1
- package/src/core/json/factories/dialogJson.tsx +24 -0
- package/src/core/json/index.ts +2 -0
- package/src/core/primitives/$ui.ts +17 -0
- package/src/core/services/DialogService.tsx +1 -48
- package/src/core/styles.css +1 -8
- package/src/core/{components/table → table/components}/ColumnPicker.tsx +2 -3
- package/src/core/{components/table → table/components}/DataTable.tsx +8 -9
- package/src/core/{components/table → table/components}/DataTableFilters.tsx +6 -3
- package/src/core/{components/table → table/components}/DataTableToolbar.tsx +4 -5
- package/src/core/{components/table → table/components}/FilterPicker.tsx +2 -3
- package/src/core/table/index.ts +12 -0
- package/src/core/{components/table → table/interfaces}/types.ts +2 -2
- package/src/demo/DemoRouter.ts +87 -6
- package/src/demo/components/DemoHome.tsx +6 -10
- package/src/demo/components/DemoLayout.tsx +38 -8
- package/src/demo/components/auth/DemoLogin.tsx +1 -1
- package/src/demo/components/auth/DemoRegister.tsx +1 -1
- package/src/demo/components/auth/DemoResetPassword.tsx +1 -1
- package/src/demo/components/auth/DemoVerifyEmail.tsx +1 -1
- package/src/demo/components/core/DemoButton.tsx +160 -0
- package/src/demo/components/core/DemoFlex.tsx +101 -0
- package/src/demo/components/core/DemoHeading.tsx +13 -0
- package/src/demo/components/core/DemoText.tsx +110 -0
- package/src/demo/components/json/DemoJsonViewer.tsx +1 -1
- package/src/demo/components/layout/DemoDialog.tsx +103 -0
- package/src/demo/components/{core → layout}/DemoSidebar.tsx +0 -1
- package/src/demo/components/layout/DemoToast.tsx +96 -0
- package/src/demo/components/shared/MacWindow.tsx +149 -74
- package/src/demo/components/shared/Showcase.tsx +4 -8
- package/src/demo/index.ts +1 -4
- package/src/demo/primitives/$uiDemo.ts +10 -0
- package/dist/admin/AdminApiKeys-CF_qOO3u.js.map +0 -1
- package/dist/admin/AdminAudits-BQno3hZG.js.map +0 -1
- package/dist/admin/AdminFiles-kvuUaASF.js.map +0 -1
- package/dist/admin/AdminJobDashboard-CrPxp0W1.js.map +0 -1
- package/dist/admin/AdminJobExecutions-D-b4Zt7W.js.map +0 -1
- package/dist/admin/AdminJobRegistry-CNX5cpDx.js.map +0 -1
- package/dist/admin/AdminLayout-e-ZP5nWw.js +0 -37
- package/dist/admin/AdminLayout-e-ZP5nWw.js.map +0 -1
- package/dist/admin/AdminParameters-DCGbpt2c.js.map +0 -1
- package/dist/admin/AdminSessions-DyhW6RZv.js.map +0 -1
- package/dist/admin/AdminUserAudits-D1GcREEE.js +0 -177
- package/dist/admin/AdminUserAudits-D1GcREEE.js.map +0 -1
- package/dist/admin/AdminUserCreate-DR8LA0tv.js +0 -104
- package/dist/admin/AdminUserCreate-DR8LA0tv.js.map +0 -1
- package/dist/admin/AdminUserDetails-CDkZNHQD.js +0 -477
- package/dist/admin/AdminUserDetails-CDkZNHQD.js.map +0 -1
- package/dist/admin/AdminUserLayout-CrBj4UuI.js.map +0 -1
- package/dist/admin/AdminUserSessions-srgFHrqy.js +0 -129
- package/dist/admin/AdminUserSessions-srgFHrqy.js.map +0 -1
- package/dist/admin/AdminUserSettings-BFuxl-xT.js +0 -167
- package/dist/admin/AdminUserSettings-BFuxl-xT.js.map +0 -1
- package/dist/admin/AdminUsers-D1pDpiwK.js +0 -118
- package/dist/admin/AdminUsers-D1pDpiwK.js.map +0 -1
- package/dist/demo/DemoDataTable-lnBKWBf8.js.map +0 -1
- package/dist/demo/DemoHome-CUMZsYaH.js.map +0 -1
- package/dist/demo/DemoJsonViewer-_uokbGaW.js +0 -429
- package/dist/demo/DemoJsonViewer-_uokbGaW.js.map +0 -1
- package/dist/demo/DemoLayout-DHVoacE6.js +0 -46
- package/dist/demo/DemoLayout-DHVoacE6.js.map +0 -1
- package/dist/demo/DemoLogin-DjJ9314c.js.map +0 -1
- package/dist/demo/DemoRegister-DzkJ5M83.js.map +0 -1
- package/dist/demo/DemoResetPassword-DWh4_BpQ.js.map +0 -1
- package/dist/demo/DemoSidebar-C1csnGhX.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-DbU_tCj8.js.map +0 -1
- package/dist/demo/Showcase-BzoXNlCn.js +0 -185
- package/dist/demo/Showcase-BzoXNlCn.js.map +0 -1
- package/dist/json/index.d.ts +0 -57
- package/dist/json/index.d.ts.map +0 -1
- package/dist/json/index.js +0 -325
- package/dist/json/index.js.map +0 -1
- package/src/admin/components/users/AdminUserAudits.tsx +0 -184
- package/src/admin/components/users/AdminUserCreate.tsx +0 -85
- package/src/admin/components/users/AdminUserDetails.tsx +0 -431
- package/src/admin/components/users/AdminUserSettings.tsx +0 -171
- package/src/core/components/data/ErrorViewer.tsx +0 -171
- package/src/json/extensions/DialogService.tsx +0 -31
- package/src/json/index.ts +0 -18
- package/src/json/styles.css +0 -1
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js +0 -0
- /package/dist/{demo → auth}/IconGoogle-Ch1m3Uzl.js.map +0 -0
- /package/src/{json → core/json}/components/JsonViewer.css +0 -0
- /package/src/{json → core/json}/components/JsonViewer.tsx +0 -0
- /package/src/core/{components/table → table/components}/DataTablePagination.tsx +0 -0
- /package/src/core/{components/table → table/components}/useTableSelection.ts +0 -0
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
import { ActionButton,
|
|
1
|
+
import { _ as ActionButton, a as TypeForm, b as useToast, s as Text$1, u as Flex$1 } from "./core-2xoLiT0o.js";
|
|
2
2
|
import { jsonSchemaToTypeBox, t } from "alepha";
|
|
3
|
-
import {
|
|
4
|
-
import { Badge, Card, Code, Collapse, Flex as Flex$1, Loader, ScrollArea, TextInput, Timeline, UnstyledButton } from "@mantine/core";
|
|
5
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
6
|
-
import { useClient } from "alepha/react";
|
|
3
|
+
import { useForm } from "alepha/react/form";
|
|
7
4
|
import { useI18n } from "alepha/react/i18n";
|
|
5
|
+
import { Badge, Card, Code, Collapse, Loader, ScrollArea, TextInput, Timeline, UnstyledButton } from "@mantine/core";
|
|
6
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
8
7
|
import { memo, useCallback, useEffect, useMemo, useState } from "react";
|
|
9
|
-
import {
|
|
8
|
+
import { IconArrowLeft, IconChevronDown, IconChevronRight, IconClock, IconFolder, IconFolderOpen, IconHistory, IconRefresh, IconSearch, IconSettings } from "@tabler/icons-react";
|
|
9
|
+
import { useClient } from "alepha/react";
|
|
10
10
|
|
|
11
11
|
//#region ../../src/admin/components/parameters/types.ts
|
|
12
12
|
const getStatusColor = (status) => {
|
|
@@ -31,7 +31,7 @@ const formatJson = (obj) => {
|
|
|
31
31
|
/**
|
|
32
32
|
* Loading state.
|
|
33
33
|
*/
|
|
34
|
-
const LoadingState = () => /* @__PURE__ */ jsx(Flex, {
|
|
34
|
+
const LoadingState = () => /* @__PURE__ */ jsx(Flex$1, {
|
|
35
35
|
flex: 1,
|
|
36
36
|
h: "100%",
|
|
37
37
|
p: "md",
|
|
@@ -40,7 +40,7 @@ const LoadingState = () => /* @__PURE__ */ jsx(Flex, {
|
|
|
40
40
|
minWidth: 0,
|
|
41
41
|
display: "flex"
|
|
42
42
|
},
|
|
43
|
-
children: /* @__PURE__ */ jsx(Flex, {
|
|
43
|
+
children: /* @__PURE__ */ jsx(Flex$1, {
|
|
44
44
|
flex: 1,
|
|
45
45
|
justify: "center",
|
|
46
46
|
align: "center",
|
|
@@ -91,7 +91,7 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
91
91
|
if (fieldCount <= 6) return 2;
|
|
92
92
|
return 3;
|
|
93
93
|
}, [fieldCount]);
|
|
94
|
-
return /* @__PURE__ */ jsx(Flex, {
|
|
94
|
+
return /* @__PURE__ */ jsx(Flex$1, {
|
|
95
95
|
flex: 1,
|
|
96
96
|
h: "100%",
|
|
97
97
|
style: {
|
|
@@ -99,26 +99,26 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
99
99
|
minWidth: 0,
|
|
100
100
|
display: "flex"
|
|
101
101
|
},
|
|
102
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
102
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
103
103
|
direction: "column",
|
|
104
104
|
h: "100%",
|
|
105
105
|
w: "100%",
|
|
106
106
|
style: { minHeight: 0 },
|
|
107
|
-
children: [/* @__PURE__ */ jsx(Flex, {
|
|
107
|
+
children: [/* @__PURE__ */ jsx(Flex$1, {
|
|
108
108
|
flex: 1,
|
|
109
109
|
p: "md",
|
|
110
110
|
className: "overflow-auto",
|
|
111
111
|
style: { minHeight: 0 },
|
|
112
|
-
children: currentContent !== null ? /* @__PURE__ */ jsxs(Flex, {
|
|
112
|
+
children: currentContent !== null ? /* @__PURE__ */ jsxs(Flex$1, {
|
|
113
113
|
direction: "column",
|
|
114
114
|
gap: "lg",
|
|
115
115
|
children: [
|
|
116
|
-
/* @__PURE__ */ jsx(Flex, { children: hasValidSchema ? /* @__PURE__ */ jsx(TypeForm, {
|
|
116
|
+
/* @__PURE__ */ jsx(Flex$1, { children: hasValidSchema ? /* @__PURE__ */ jsx(TypeForm, {
|
|
117
117
|
form,
|
|
118
118
|
columns,
|
|
119
119
|
skipSubmitButton: true,
|
|
120
120
|
fill: false
|
|
121
|
-
}) : /* @__PURE__ */ jsxs(Flex, { children: [/* @__PURE__ */ jsx(Text, {
|
|
121
|
+
}) : /* @__PURE__ */ jsxs(Flex$1, { children: [/* @__PURE__ */ jsx(Text$1, {
|
|
122
122
|
size: "xs",
|
|
123
123
|
c: "dimmed",
|
|
124
124
|
mb: 4,
|
|
@@ -128,36 +128,36 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
128
128
|
style: { whiteSpace: "pre-wrap" },
|
|
129
129
|
children: formatJson(currentContent)
|
|
130
130
|
})] }) }),
|
|
131
|
-
configValue?.current?.changeDescription && /* @__PURE__ */ jsxs(Flex, { children: [/* @__PURE__ */ jsx(Text, {
|
|
131
|
+
configValue?.current?.changeDescription && /* @__PURE__ */ jsxs(Flex$1, { children: [/* @__PURE__ */ jsx(Text$1, {
|
|
132
132
|
size: "xs",
|
|
133
133
|
c: "dimmed",
|
|
134
134
|
mb: 4,
|
|
135
135
|
children: "Change Description"
|
|
136
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
136
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
137
137
|
size: "sm",
|
|
138
138
|
children: configValue.current.changeDescription
|
|
139
139
|
})] }),
|
|
140
|
-
configValue?.current && /* @__PURE__ */ jsxs(Flex, {
|
|
140
|
+
configValue?.current && /* @__PURE__ */ jsxs(Flex$1, {
|
|
141
141
|
gap: "xl",
|
|
142
|
-
children: [/* @__PURE__ */ jsxs(Flex, { children: [/* @__PURE__ */ jsx(Text, {
|
|
142
|
+
children: [/* @__PURE__ */ jsxs(Flex$1, { children: [/* @__PURE__ */ jsx(Text$1, {
|
|
143
143
|
size: "xs",
|
|
144
144
|
c: "dimmed",
|
|
145
145
|
mb: 2,
|
|
146
146
|
children: "Updated"
|
|
147
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
147
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
148
148
|
size: "sm",
|
|
149
149
|
children: l(configValue.current.updatedAt, { date: "fromNow" })
|
|
150
|
-
})] }), configValue.current.creatorName && /* @__PURE__ */ jsxs(Flex, { children: [/* @__PURE__ */ jsx(Text, {
|
|
150
|
+
})] }), configValue.current.creatorName && /* @__PURE__ */ jsxs(Flex$1, { children: [/* @__PURE__ */ jsx(Text$1, {
|
|
151
151
|
size: "xs",
|
|
152
152
|
c: "dimmed",
|
|
153
153
|
mb: 2,
|
|
154
154
|
children: "Updated By"
|
|
155
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
155
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
156
156
|
size: "sm",
|
|
157
157
|
children: configValue.current.creatorName
|
|
158
158
|
})] })]
|
|
159
159
|
}),
|
|
160
|
-
!configValue?.current && configValue?.currentValue !== void 0 && /* @__PURE__ */ jsx(Text, {
|
|
160
|
+
!configValue?.current && configValue?.currentValue !== void 0 && /* @__PURE__ */ jsx(Text$1, {
|
|
161
161
|
size: "xs",
|
|
162
162
|
c: "dimmed",
|
|
163
163
|
children: "This configuration is using its default value. No versions have been saved to the database yet."
|
|
@@ -166,16 +166,16 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
166
166
|
withBorder: true,
|
|
167
167
|
p: "sm",
|
|
168
168
|
bg: "var(--mantine-color-blue-light)",
|
|
169
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
169
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
170
170
|
direction: "column",
|
|
171
171
|
gap: "xs",
|
|
172
172
|
children: [
|
|
173
|
-
/* @__PURE__ */ jsxs(Flex, {
|
|
173
|
+
/* @__PURE__ */ jsxs(Flex$1, {
|
|
174
174
|
gap: "xs",
|
|
175
175
|
children: [/* @__PURE__ */ jsx(IconClock, {
|
|
176
176
|
size: 14,
|
|
177
177
|
color: "var(--mantine-color-blue-6)"
|
|
178
|
-
}), /* @__PURE__ */ jsxs(Text, {
|
|
178
|
+
}), /* @__PURE__ */ jsxs(Text$1, {
|
|
179
179
|
size: "xs",
|
|
180
180
|
fw: 500,
|
|
181
181
|
c: "blue",
|
|
@@ -186,7 +186,7 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
186
186
|
]
|
|
187
187
|
})]
|
|
188
188
|
}),
|
|
189
|
-
/* @__PURE__ */ jsxs(Text, {
|
|
189
|
+
/* @__PURE__ */ jsxs(Text$1, {
|
|
190
190
|
size: "xs",
|
|
191
191
|
c: "dimmed",
|
|
192
192
|
children: [
|
|
@@ -205,23 +205,23 @@ const ConfigForm = ({ selectedConfig, configValue, saving, onSave }) => {
|
|
|
205
205
|
})
|
|
206
206
|
})
|
|
207
207
|
]
|
|
208
|
-
}) : /* @__PURE__ */ jsx(Flex, {
|
|
208
|
+
}) : /* @__PURE__ */ jsx(Flex$1, {
|
|
209
209
|
justify: "center",
|
|
210
210
|
align: "center",
|
|
211
211
|
h: 200,
|
|
212
|
-
children: /* @__PURE__ */ jsx(Text, {
|
|
212
|
+
children: /* @__PURE__ */ jsx(Text$1, {
|
|
213
213
|
c: "dimmed",
|
|
214
214
|
size: "sm",
|
|
215
215
|
children: "No current value"
|
|
216
216
|
})
|
|
217
217
|
})
|
|
218
|
-
}), hasValidSchema && currentContent !== null && /* @__PURE__ */ jsx(Flex, {
|
|
218
|
+
}), hasValidSchema && currentContent !== null && /* @__PURE__ */ jsx(Flex$1, {
|
|
219
219
|
p: "md",
|
|
220
220
|
style: {
|
|
221
221
|
flexShrink: 0,
|
|
222
222
|
borderTop: "1px solid var(--mantine-color-default-border)"
|
|
223
223
|
},
|
|
224
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
224
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
225
225
|
justify: "flex-end",
|
|
226
226
|
gap: "sm",
|
|
227
227
|
children: [/* @__PURE__ */ jsx(ActionButton, {
|
|
@@ -277,11 +277,11 @@ const ParameterEmptyState = () => {
|
|
|
277
277
|
direction: "column",
|
|
278
278
|
align: "center",
|
|
279
279
|
gap: 4,
|
|
280
|
-
children: [/* @__PURE__ */ jsx(Text, {
|
|
280
|
+
children: [/* @__PURE__ */ jsx(Text$1, {
|
|
281
281
|
fw: 500,
|
|
282
282
|
c: "dimmed",
|
|
283
283
|
children: "No Parameter Selected"
|
|
284
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
284
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
285
285
|
size: "xs",
|
|
286
286
|
c: "dimmed",
|
|
287
287
|
ta: "center",
|
|
@@ -298,17 +298,17 @@ const ParameterEmptyState = () => {
|
|
|
298
298
|
const ParameterHistory = ({ history, loading, onRollback }) => {
|
|
299
299
|
const { l } = useI18n();
|
|
300
300
|
const renderContent = () => {
|
|
301
|
-
if (loading) return /* @__PURE__ */ jsx(Flex, {
|
|
301
|
+
if (loading) return /* @__PURE__ */ jsx(Flex$1, {
|
|
302
302
|
flex: 1,
|
|
303
303
|
justify: "center",
|
|
304
304
|
align: "center",
|
|
305
305
|
children: /* @__PURE__ */ jsx(Loader, { size: "sm" })
|
|
306
306
|
});
|
|
307
|
-
if (history.length === 0) return /* @__PURE__ */ jsx(Flex, {
|
|
307
|
+
if (history.length === 0) return /* @__PURE__ */ jsx(Flex$1, {
|
|
308
308
|
flex: 1,
|
|
309
309
|
justify: "center",
|
|
310
310
|
align: "center",
|
|
311
|
-
children: /* @__PURE__ */ jsx(Text, {
|
|
311
|
+
children: /* @__PURE__ */ jsx(Text$1, {
|
|
312
312
|
c: "dimmed",
|
|
313
313
|
size: "xs",
|
|
314
314
|
children: "Empty"
|
|
@@ -322,14 +322,14 @@ const ParameterHistory = ({ history, loading, onRollback }) => {
|
|
|
322
322
|
bulletSize: 24,
|
|
323
323
|
lineWidth: 2,
|
|
324
324
|
children: history.map((version) => /* @__PURE__ */ jsx(Timeline.Item, {
|
|
325
|
-
bullet: /* @__PURE__ */ jsx(Text, {
|
|
325
|
+
bullet: /* @__PURE__ */ jsx(Text$1, {
|
|
326
326
|
size: "xs",
|
|
327
327
|
fw: 500,
|
|
328
328
|
children: version.version
|
|
329
329
|
}),
|
|
330
|
-
title: /* @__PURE__ */ jsxs(Flex, {
|
|
330
|
+
title: /* @__PURE__ */ jsxs(Flex$1, {
|
|
331
331
|
gap: "xs",
|
|
332
|
-
children: [/* @__PURE__ */ jsxs(Text, {
|
|
332
|
+
children: [/* @__PURE__ */ jsxs(Text$1, {
|
|
333
333
|
size: "xs",
|
|
334
334
|
fw: 500,
|
|
335
335
|
children: ["Version ", version.version]
|
|
@@ -340,22 +340,22 @@ const ParameterHistory = ({ history, loading, onRollback }) => {
|
|
|
340
340
|
children: version.status
|
|
341
341
|
})]
|
|
342
342
|
}),
|
|
343
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
343
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
344
344
|
direction: "column",
|
|
345
345
|
gap: 4,
|
|
346
346
|
mt: 4,
|
|
347
347
|
children: [
|
|
348
|
-
/* @__PURE__ */ jsx(Text, {
|
|
348
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
349
349
|
size: "xs",
|
|
350
350
|
c: "dimmed",
|
|
351
351
|
children: l(version.createdAt, { date: "fromNow" })
|
|
352
352
|
}),
|
|
353
|
-
version.changeDescription && /* @__PURE__ */ jsx(Text, {
|
|
353
|
+
version.changeDescription && /* @__PURE__ */ jsx(Text$1, {
|
|
354
354
|
size: "xs",
|
|
355
355
|
lineClamp: 2,
|
|
356
356
|
children: version.changeDescription
|
|
357
357
|
}),
|
|
358
|
-
version.creatorName && /* @__PURE__ */ jsxs(Text, {
|
|
358
|
+
version.creatorName && /* @__PURE__ */ jsxs(Text$1, {
|
|
359
359
|
size: "xs",
|
|
360
360
|
c: "dimmed",
|
|
361
361
|
children: ["by ", version.creatorName]
|
|
@@ -378,8 +378,8 @@ const ParameterHistory = ({ history, loading, onRollback }) => {
|
|
|
378
378
|
})
|
|
379
379
|
});
|
|
380
380
|
};
|
|
381
|
-
return /* @__PURE__ */ jsx(Flex, {
|
|
382
|
-
w:
|
|
381
|
+
return /* @__PURE__ */ jsx(Flex$1, {
|
|
382
|
+
w: 220,
|
|
383
383
|
h: "100%",
|
|
384
384
|
p: "xs",
|
|
385
385
|
style: {
|
|
@@ -389,17 +389,17 @@ const ParameterHistory = ({ history, loading, onRollback }) => {
|
|
|
389
389
|
flexDirection: "column",
|
|
390
390
|
borderLeft: "1px solid var(--mantine-color-default-border)"
|
|
391
391
|
},
|
|
392
|
-
children: /* @__PURE__ */ jsxs(Flex, {
|
|
392
|
+
children: /* @__PURE__ */ jsxs(Flex$1, {
|
|
393
393
|
direction: "column",
|
|
394
394
|
gap: "xs",
|
|
395
395
|
h: "100%",
|
|
396
396
|
style: { minHeight: 0 },
|
|
397
|
-
children: [/* @__PURE__ */ jsxs(Flex, {
|
|
397
|
+
children: [/* @__PURE__ */ jsxs(Flex$1, {
|
|
398
398
|
gap: "xs",
|
|
399
399
|
children: [/* @__PURE__ */ jsx(IconHistory, {
|
|
400
400
|
size: 16,
|
|
401
401
|
color: "var(--mantine-color-dimmed)"
|
|
402
|
-
}), /* @__PURE__ */ jsx(Text, {
|
|
402
|
+
}), /* @__PURE__ */ jsx(Text$1, {
|
|
403
403
|
size: "sm",
|
|
404
404
|
fw: 500,
|
|
405
405
|
children: "History"
|
|
@@ -486,7 +486,7 @@ const TreeNode = memo(({ node, level, selectedConfig, onSelect, expandedNodes, o
|
|
|
486
486
|
size: 16,
|
|
487
487
|
color: isSelected ? "var(--mantine-color-blue-6)" : "var(--mantine-color-dimmed)",
|
|
488
488
|
style: { flexShrink: 0 }
|
|
489
|
-
})] }), /* @__PURE__ */ jsx(Text, {
|
|
489
|
+
})] }), /* @__PURE__ */ jsx(Text$1, {
|
|
490
490
|
size: "sm",
|
|
491
491
|
fw: isSelected ? 600 : 400,
|
|
492
492
|
c: isSelected ? void 0 : isLeaf ? void 0 : "dimmed",
|
|
@@ -559,7 +559,7 @@ const ParameterTree = ({ treeData, selectedConfig, onSelect, onRefresh }) => {
|
|
|
559
559
|
/* @__PURE__ */ jsxs(Flex$1, {
|
|
560
560
|
justify: "space-between",
|
|
561
561
|
gap: "xs",
|
|
562
|
-
children: [/* @__PURE__ */ jsx(Text, {
|
|
562
|
+
children: [/* @__PURE__ */ jsx(Text$1, {
|
|
563
563
|
size: "sm",
|
|
564
564
|
fw: 600,
|
|
565
565
|
children: "Parameters"
|
|
@@ -582,7 +582,7 @@ const ParameterTree = ({ treeData, selectedConfig, onSelect, onRefresh }) => {
|
|
|
582
582
|
flex: 1,
|
|
583
583
|
offsetScrollbars: true,
|
|
584
584
|
style: { minHeight: 0 },
|
|
585
|
-
children: filteredTreeData.length === 0 ? /* @__PURE__ */ jsx(Text, {
|
|
585
|
+
children: filteredTreeData.length === 0 ? /* @__PURE__ */ jsx(Text$1, {
|
|
586
586
|
size: "xs",
|
|
587
587
|
c: "dimmed",
|
|
588
588
|
ta: "center",
|
|
@@ -726,11 +726,11 @@ const AdminParameters = ({ treeData: initialTreeData }) => {
|
|
|
726
726
|
stroke: 1.5,
|
|
727
727
|
color: "var(--mantine-color-dimmed)"
|
|
728
728
|
}),
|
|
729
|
-
/* @__PURE__ */ jsx(Text, {
|
|
729
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
730
730
|
c: "dimmed",
|
|
731
731
|
children: "No Parameters Found"
|
|
732
732
|
}),
|
|
733
|
-
/* @__PURE__ */ jsx(Text, {
|
|
733
|
+
/* @__PURE__ */ jsx(Text$1, {
|
|
734
734
|
size: "xs",
|
|
735
735
|
c: "dimmed",
|
|
736
736
|
ta: "center",
|
|
@@ -771,4 +771,4 @@ const AdminParameters = ({ treeData: initialTreeData }) => {
|
|
|
771
771
|
|
|
772
772
|
//#endregion
|
|
773
773
|
export { AdminParameters as default };
|
|
774
|
-
//# sourceMappingURL=AdminParameters-
|
|
774
|
+
//# sourceMappingURL=AdminParameters-DHw9ATgl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminParameters-DHw9ATgl.js","names":["Flex","Text","Flex","Text","Flex","Text","Flex","Text","Flex","Text"],"sources":["../../src/admin/components/parameters/types.ts","../../src/admin/components/parameters/ParameterDetails.tsx","../../src/admin/components/parameters/ParameterEmptyState.tsx","../../src/admin/components/parameters/ParameterHistory.tsx","../../src/admin/components/parameters/ParameterTree.tsx","../../src/admin/components/parameters/AdminParameters.tsx"],"sourcesContent":["import type { ParameterResponse } from \"alepha/api/parameters\";\n\nexport interface ParameterValue {\n current?: ParameterResponse;\n next?: ParameterResponse;\n /**\n * Default value from the registered $parameter primitive.\n */\n defaultValue?: unknown;\n /**\n * Current in-memory value (may be default if never saved).\n */\n currentValue?: unknown;\n /**\n * TypeBox/JSON schema for the parameter (as JSON from API).\n */\n schema?: Record<string, unknown>;\n}\n\nexport const getStatusColor = (status: string) => {\n switch (status) {\n case \"current\":\n return \"green\";\n case \"next\":\n return \"blue\";\n case \"future\":\n return \"cyan\";\n case \"expired\":\n return \"gray\";\n default:\n return \"gray\";\n }\n};\n\nexport const formatJson = (obj: unknown): string => {\n try {\n return JSON.stringify(obj, null, 2);\n } catch {\n return String(obj);\n }\n};\n","import { ActionButton, Flex, Text, TypeForm } from \"@alepha/ui\";\nimport { Card, Code, Loader } from \"@mantine/core\";\nimport { IconClock } from \"@tabler/icons-react\";\nimport { jsonSchemaToTypeBox, type TObject, t } from \"alepha\";\nimport { useForm } from \"alepha/react/form\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useMemo } from \"react\";\nimport { formatJson, type ParameterValue } from \"./types.ts\";\n\nexport interface ParameterDetailsProps {\n selectedConfig: string | null;\n configValue: ParameterValue | null;\n loading: boolean;\n saving: boolean;\n onSave: (values: Record<string, unknown>) => Promise<void>;\n}\n\n/**\n * Loading state.\n */\nconst LoadingState = () => (\n <Flex\n flex={1}\n h=\"100%\"\n p=\"md\"\n style={{\n overflow: \"hidden\",\n minWidth: 0,\n display: \"flex\",\n }}\n >\n <Flex flex={1} justify=\"center\" align=\"center\" h=\"100%\">\n <Loader size=\"sm\" />\n </Flex>\n </Flex>\n);\n\ninterface ConfigFormProps {\n selectedConfig: string;\n configValue: ParameterValue | null;\n saving: boolean;\n onSave: (values: Record<string, unknown>) => Promise<void>;\n}\n\n/**\n * The actual form component - only rendered when a config is selected.\n */\nconst ConfigForm = ({\n selectedConfig,\n configValue,\n saving,\n onSave,\n}: ConfigFormProps) => {\n const { l } = useI18n();\n\n // Get the current value to display (from saved version or default)\n const currentContent = useMemo(() => {\n if (configValue?.current?.content) {\n return configValue.current.content;\n }\n if (configValue?.currentValue !== undefined) {\n return configValue.currentValue;\n }\n return null;\n }, [configValue]);\n\n // Convert JSON Schema from API to TypeBox schema\n const schemaForForm = useMemo(() => {\n if (!configValue?.schema) {\n return t.object({});\n }\n try {\n return jsonSchemaToTypeBox(configValue.schema) as TObject;\n } catch {\n return t.object({});\n }\n }, [configValue?.schema]);\n\n const form = useForm(\n {\n schema: schemaForForm,\n initialValues: (currentContent ?? {}) as Record<string, unknown>,\n handler: async (values) => {\n await onSave(values as Record<string, unknown>);\n },\n },\n [selectedConfig, schemaForForm, currentContent],\n );\n\n // Check if we have a valid schema with properties\n const hasValidSchema = useMemo(() => {\n const schema = configValue?.schema;\n return (\n schema &&\n typeof schema === \"object\" &&\n \"properties\" in schema &&\n Object.keys(schema.properties as object).length > 0\n );\n }, [configValue?.schema]);\n\n // Count the number of fields to determine column layout\n const fieldCount = useMemo(() => {\n const schema = configValue?.schema;\n if (\n schema &&\n typeof schema === \"object\" &&\n \"properties\" in schema &&\n schema.properties\n ) {\n return Object.keys(schema.properties as object).length;\n }\n return 0;\n }, [configValue?.schema]);\n\n // Determine optimal column count based on field count\n const columns = useMemo(() => {\n if (fieldCount <= 2) return 1;\n if (fieldCount <= 6) return 2;\n return 3;\n }, [fieldCount]);\n\n return (\n <Flex\n flex={1}\n h=\"100%\"\n style={{\n overflow: \"hidden\",\n minWidth: 0,\n display: \"flex\",\n }}\n >\n <Flex direction=\"column\" h=\"100%\" w=\"100%\" style={{ minHeight: 0 }}>\n {/* Content */}\n <Flex\n flex={1}\n p=\"md\"\n className=\"overflow-auto\"\n style={{ minHeight: 0 }}\n >\n {currentContent !== null ? (\n <Flex direction=\"column\" gap=\"lg\">\n {/* Form or JSON view */}\n <Flex>\n {hasValidSchema ? (\n <TypeForm\n form={form}\n columns={columns}\n skipSubmitButton\n fill={false}\n />\n ) : (\n <Flex>\n <Text size=\"xs\" c=\"dimmed\" mb={4}>\n Current Value\n </Text>\n <Code block style={{ whiteSpace: \"pre-wrap\" }}>\n {formatJson(currentContent)}\n </Code>\n </Flex>\n )}\n </Flex>\n\n {/* Metadata */}\n {configValue?.current?.changeDescription && (\n <Flex>\n <Text size=\"xs\" c=\"dimmed\" mb={4}>\n Change Description\n </Text>\n <Text size=\"sm\">{configValue.current.changeDescription}</Text>\n </Flex>\n )}\n\n {configValue?.current && (\n <Flex gap=\"xl\">\n <Flex>\n <Text size=\"xs\" c=\"dimmed\" mb={2}>\n Updated\n </Text>\n <Text size=\"sm\">\n {l(configValue.current.updatedAt, { date: \"fromNow\" })}\n </Text>\n </Flex>\n {configValue.current.creatorName && (\n <Flex>\n <Text size=\"xs\" c=\"dimmed\" mb={2}>\n Updated By\n </Text>\n <Text size=\"sm\">{configValue.current.creatorName}</Text>\n </Flex>\n )}\n </Flex>\n )}\n\n {!configValue?.current &&\n configValue?.currentValue !== undefined && (\n <Text size=\"xs\" c=\"dimmed\">\n This configuration is using its default value. No versions\n have been saved to the database yet.\n </Text>\n )}\n\n {/* Scheduled update preview */}\n {configValue?.next && (\n <Card withBorder p=\"sm\" bg=\"var(--mantine-color-blue-light)\">\n <Flex direction=\"column\" gap=\"xs\">\n <Flex gap=\"xs\">\n <IconClock\n size={14}\n color=\"var(--mantine-color-blue-6)\"\n />\n <Text size=\"xs\" fw={500} c=\"blue\">\n Scheduled Update (v{configValue.next.version})\n </Text>\n </Flex>\n <Text size=\"xs\" c=\"dimmed\">\n Activates{\" \"}\n {l(configValue.next.activationDate, {\n date: \"fromNow\",\n })}\n </Text>\n <Code block style={{ whiteSpace: \"pre-wrap\" }} fz=\"xs\">\n {formatJson(configValue.next.content)}\n </Code>\n </Flex>\n </Card>\n )}\n </Flex>\n ) : (\n <Flex justify=\"center\" align=\"center\" h={200}>\n <Text c=\"dimmed\" size=\"sm\">\n No current value\n </Text>\n </Flex>\n )}\n </Flex>\n\n {/* Footer with actions */}\n {hasValidSchema && currentContent !== null && (\n <Flex\n p=\"md\"\n style={{\n flexShrink: 0,\n borderTop: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex justify=\"flex-end\" gap=\"sm\">\n <ActionButton\n variant=\"subtle\"\n onClick={() => form.reset({} as any)}\n disabled={saving}\n >\n Reset\n </ActionButton>\n <ActionButton intent=\"primary\" form={form} loading={saving}>\n Save Changes\n </ActionButton>\n </Flex>\n </Flex>\n )}\n </Flex>\n </Flex>\n );\n};\n\n/**\n * Parameter details panel.\n * Shows loading state or the config form.\n * Note: Empty state is handled by parent (AdminParameters).\n */\nconst ParameterDetails = ({\n selectedConfig,\n configValue,\n loading,\n saving,\n onSave,\n}: ParameterDetailsProps) => {\n // Loading state\n if (loading) {\n return <LoadingState />;\n }\n\n // Config form (selectedConfig is guaranteed to be non-null by parent)\n return (\n <ConfigForm\n selectedConfig={selectedConfig!}\n configValue={configValue}\n saving={saving}\n onSave={onSave}\n />\n );\n};\n\nexport default ParameterDetails;\n","import { Flex, Text } from \"@alepha/ui\";\nimport { IconArrowLeft } from \"@tabler/icons-react\";\n\n/**\n * Empty state displayed when no parameter is selected.\n * Invites user to select a parameter from the tree.\n */\nconst ParameterEmptyState = () => {\n return (\n <Flex flex={1} p={\"xl\"} align=\"center\">\n <Flex direction=\"column\" align=\"center\" gap=\"md\">\n <IconArrowLeft size={32} color=\"var(--mantine-color-dimmed)\" />\n <Flex direction=\"column\" align=\"center\" gap={4}>\n <Text fw={500} c=\"dimmed\">\n No Parameter Selected\n </Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={240}>\n Choose a parameter from the tree to view and edit its configuration\n </Text>\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport default ParameterEmptyState;\n","import { ActionButton, Flex, Text } from \"@alepha/ui\";\nimport { Badge, Loader, ScrollArea, Timeline } from \"@mantine/core\";\nimport { IconHistory } from \"@tabler/icons-react\";\nimport type { ParameterResponse } from \"alepha/api/parameters\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { getStatusColor } from \"./types.ts\";\n\nexport interface ParameterHistoryProps {\n selectedConfig: string | null;\n history: ParameterResponse[];\n loading: boolean;\n onRollback: (version: number) => void;\n}\n\nconst ParameterHistory = ({\n history,\n loading,\n onRollback,\n}: ParameterHistoryProps) => {\n const { l } = useI18n();\n\n const renderContent = () => {\n if (loading) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Loader size=\"sm\" />\n </Flex>\n );\n }\n\n if (history.length === 0) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Text c=\"dimmed\" size=\"xs\">\n Empty\n </Text>\n </Flex>\n );\n }\n\n return (\n <ScrollArea flex={1} offsetScrollbars>\n <Timeline\n active={history.findIndex((h) => h.status === \"current\")}\n bulletSize={24}\n lineWidth={2}\n >\n {history.map((version) => (\n <Timeline.Item\n key={version.id}\n bullet={\n <Text size=\"xs\" fw={500}>\n {version.version}\n </Text>\n }\n title={\n <Flex gap=\"xs\">\n <Text size=\"xs\" fw={500}>\n Version {version.version}\n </Text>\n <Badge\n size=\"xs\"\n variant=\"light\"\n color={getStatusColor(version.status)}\n >\n {version.status}\n </Badge>\n </Flex>\n }\n >\n <Flex direction=\"column\" gap={4} mt={4}>\n <Text size=\"xs\" c=\"dimmed\">\n {l(version.createdAt, { date: \"fromNow\" })}\n </Text>\n {version.changeDescription && (\n <Text size=\"xs\" lineClamp={2}>\n {version.changeDescription}\n </Text>\n )}\n {version.creatorName && (\n <Text size=\"xs\" c=\"dimmed\">\n by {version.creatorName}\n </Text>\n )}\n {version.migrationLog && (\n <Badge size=\"xs\" variant=\"outline\" color=\"orange\">\n Schema Changed\n </Badge>\n )}\n {version.status === \"expired\" && (\n <ActionButton\n size=\"compact-xs\"\n variant=\"subtle\"\n onClick={() => onRollback(version.version)}\n >\n Rollback to this version\n </ActionButton>\n )}\n </Flex>\n </Timeline.Item>\n ))}\n </Timeline>\n </ScrollArea>\n );\n };\n\n return (\n <Flex\n w={220}\n h=\"100%\"\n p=\"xs\"\n style={{\n flexShrink: 0,\n overflow: \"hidden\",\n display: \"flex\",\n flexDirection: \"column\",\n borderLeft: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex direction=\"column\" gap=\"xs\" h=\"100%\" style={{ minHeight: 0 }}>\n <Flex gap=\"xs\">\n <IconHistory size={16} color=\"var(--mantine-color-dimmed)\" />\n <Text size=\"sm\" fw={500}>\n History\n </Text>\n </Flex>\n {renderContent()}\n </Flex>\n </Flex>\n );\n};\n\nexport default ParameterHistory;\n","import { ActionButton, Flex, Text } from \"@alepha/ui\";\nimport { Collapse, ScrollArea, TextInput, UnstyledButton } from \"@mantine/core\";\nimport {\n IconChevronDown,\n IconChevronRight,\n IconFolder,\n IconFolderOpen,\n IconRefresh,\n IconSearch,\n IconSettings,\n} from \"@tabler/icons-react\";\nimport type { ParameterTreeNode } from \"alepha/api/parameters\";\nimport { memo, useCallback, useMemo, useState } from \"react\";\n\nexport interface ParameterTreeProps {\n treeData: ParameterTreeNode[];\n selectedConfig: string | null;\n onSelect: (name: string) => void;\n onRefresh: () => void;\n}\n\n/**\n * Filters tree nodes by search query.\n */\nconst filterTree = (\n nodes: ParameterTreeNode[],\n query: string,\n): ParameterTreeNode[] => {\n if (!query.trim()) return nodes;\n\n const lowerQuery = query.toLowerCase();\n\n return nodes\n .map((node) => {\n const filteredChildren = filterTree(node.children, query);\n const nameMatches = node.name.toLowerCase().includes(lowerQuery);\n const pathMatches = node.path.toLowerCase().includes(lowerQuery);\n\n if (nameMatches || pathMatches || filteredChildren.length > 0) {\n return {\n ...node,\n children: filteredChildren,\n };\n }\n\n return null;\n })\n .filter((node): node is ParameterTreeNode => node !== null);\n};\n\ninterface TreeNodeProps {\n node: ParameterTreeNode;\n level: number;\n selectedConfig: string | null;\n onSelect: (name: string) => void;\n expandedNodes: Set<string>;\n onToggle: (path: string) => void;\n}\n\n/**\n * Memoized tree node to prevent unnecessary re-renders.\n */\nconst TreeNode = memo(\n ({\n node,\n level,\n selectedConfig,\n onSelect,\n expandedNodes,\n onToggle,\n }: TreeNodeProps) => {\n const [isHovered, setIsHovered] = useState(false);\n const hasChildren = node.children.length > 0;\n const isExpanded = expandedNodes.has(node.path);\n const isSelected = selectedConfig === node.path;\n const isLeaf = !hasChildren;\n\n const handleClick = useCallback(() => {\n if (hasChildren) {\n onToggle(node.path);\n } else {\n onSelect(node.path);\n }\n }, [hasChildren, node.path, onToggle, onSelect]);\n\n const handleMouseEnter = useCallback(() => setIsHovered(true), []);\n const handleMouseLeave = useCallback(() => setIsHovered(false), []);\n\n return (\n <Flex>\n <UnstyledButton\n onClick={handleClick}\n onMouseEnter={handleMouseEnter}\n onMouseLeave={handleMouseLeave}\n w=\"100%\"\n style={{ display: \"block\" }}\n >\n <Flex\n gap={6}\n wrap=\"nowrap\"\n p=\"4px 8px\"\n pl={8 + level * 16}\n style={{\n borderRadius: \"var(--mantine-radius-sm)\",\n backgroundColor:\n isSelected || isHovered\n ? \"var(--mantine-color-default-hover)\"\n : undefined,\n }}\n >\n {hasChildren ? (\n <>\n <Flex\n style={{\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n width: 16,\n }}\n >\n {isExpanded ? (\n <IconChevronDown\n size={14}\n color=\"var(--mantine-color-dimmed)\"\n />\n ) : (\n <IconChevronRight\n size={14}\n color=\"var(--mantine-color-dimmed)\"\n />\n )}\n </Flex>\n {isExpanded ? (\n <IconFolderOpen\n size={16}\n color=\"var(--mantine-color-dimmed)\"\n style={{ flexShrink: 0 }}\n />\n ) : (\n <IconFolder\n size={16}\n color=\"var(--mantine-color-dimmed)\"\n style={{ flexShrink: 0 }}\n />\n )}\n </>\n ) : (\n <>\n <Flex w={16} />\n <IconSettings\n size={16}\n color={\n isSelected\n ? \"var(--mantine-color-blue-6)\"\n : \"var(--mantine-color-dimmed)\"\n }\n style={{ flexShrink: 0 }}\n />\n </>\n )}\n <Text\n size=\"sm\"\n fw={isSelected ? 600 : 400}\n c={isSelected ? undefined : isLeaf ? undefined : \"dimmed\"}\n style={{\n whiteSpace: \"nowrap\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n }}\n >\n {node.name}\n </Text>\n </Flex>\n </UnstyledButton>\n\n {hasChildren && (\n <Collapse in={isExpanded}>\n {node.children.map((child: ParameterTreeNode) => (\n <TreeNode\n key={child.path}\n node={child}\n level={level + 1}\n selectedConfig={selectedConfig}\n onSelect={onSelect}\n expandedNodes={expandedNodes}\n onToggle={onToggle}\n />\n ))}\n </Collapse>\n )}\n </Flex>\n );\n },\n);\n\nTreeNode.displayName = \"TreeNode\";\n\n/**\n * Collects all folder paths to expand by default.\n */\nconst collectAllFolderPaths = (nodes: ParameterTreeNode[]): Set<string> => {\n const paths = new Set<string>();\n\n const traverse = (nodeList: ParameterTreeNode[]) => {\n for (const node of nodeList) {\n if (node.children.length > 0) {\n paths.add(node.path);\n traverse(node.children);\n }\n }\n };\n\n traverse(nodes);\n return paths;\n};\n\nconst ParameterTree = ({\n treeData,\n selectedConfig,\n onSelect,\n onRefresh,\n}: ParameterTreeProps) => {\n const [searchQuery, setSearchQuery] = useState(\"\");\n const [expandedNodes, setExpandedNodes] = useState<Set<string>>(() =>\n collectAllFolderPaths(treeData),\n );\n\n // Filter tree by search query\n const filteredTreeData = useMemo(\n () => filterTree(treeData, searchQuery),\n [treeData, searchQuery],\n );\n\n const handleToggle = useCallback((path: string) => {\n setExpandedNodes((prev) => {\n const next = new Set(prev);\n if (next.has(path)) {\n next.delete(path);\n } else {\n next.add(path);\n }\n return next;\n });\n }, []);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n setSearchQuery(e.currentTarget.value);\n },\n [],\n );\n\n return (\n <Flex\n w={280}\n h=\"100%\"\n p=\"sm\"\n style={{\n flexShrink: 0,\n display: \"flex\",\n flexDirection: \"column\",\n borderRight: \"1px solid var(--mantine-color-default-border)\",\n }}\n >\n <Flex direction=\"column\" gap=\"sm\" h=\"100%\" style={{ minHeight: 0 }}>\n <Flex justify=\"space-between\" gap=\"xs\">\n <Text size=\"sm\" fw={600}>\n Parameters\n </Text>\n <ActionButton\n variant=\"subtle\"\n size=\"compact-xs\"\n onClick={onRefresh}\n tooltip=\"Refresh\"\n >\n <IconRefresh size={14} />\n </ActionButton>\n </Flex>\n\n <TextInput\n placeholder=\"Search...\"\n size=\"xs\"\n leftSection={<IconSearch size={14} />}\n value={searchQuery}\n onChange={handleSearchChange}\n />\n\n <ScrollArea flex={1} offsetScrollbars style={{ minHeight: 0 }}>\n {filteredTreeData.length === 0 ? (\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" py=\"md\">\n {searchQuery ? \"No matching parameters\" : \"No parameters\"}\n </Text>\n ) : (\n <Flex direction=\"column\" gap={0} style={{ gap: 1 }}>\n {filteredTreeData.map((node) => (\n <TreeNode\n key={node.path}\n node={node}\n level={0}\n selectedConfig={selectedConfig}\n onSelect={onSelect}\n expandedNodes={expandedNodes}\n onToggle={handleToggle}\n />\n ))}\n </Flex>\n )}\n </ScrollArea>\n </Flex>\n </Flex>\n );\n};\n\nexport default ParameterTree;\n","import { Flex, Text, useToast } from \"@alepha/ui\";\nimport { Card } from \"@mantine/core\";\nimport { IconSettings } from \"@tabler/icons-react\";\nimport type {\n AdminParameterController,\n ParameterResponse,\n ParameterTreeNode,\n} from \"alepha/api/parameters\";\nimport { useClient } from \"alepha/react\";\nimport { useCallback, useEffect, useState } from \"react\";\nimport ParameterDetails from \"./ParameterDetails.tsx\";\nimport ParameterEmptyState from \"./ParameterEmptyState.tsx\";\nimport ParameterHistory from \"./ParameterHistory.tsx\";\nimport ParameterTree from \"./ParameterTree.tsx\";\nimport type { ParameterValue } from \"./types.ts\";\n\nexport interface AdminParametersProps {\n treeData: ParameterTreeNode[];\n}\n\nconst AdminParameters = ({\n treeData: initialTreeData,\n}: AdminParametersProps) => {\n const client = useClient<AdminParameterController>();\n const toast = useToast();\n\n // State\n const [treeData, setTreeData] =\n useState<ParameterTreeNode[]>(initialTreeData);\n const [selectedConfig, setSelectedConfig] = useState<string | null>(null);\n const [configValue, setConfigValue] = useState<ParameterValue | null>(null);\n const [history, setHistory] = useState<ParameterResponse[]>([]);\n const [loadingConfig, setLoadingConfig] = useState(false);\n const [loadingHistory, setLoadingHistory] = useState(false);\n const [saving, setSaving] = useState(false);\n\n // Refresh tree data\n const handleRefresh = useCallback(async () => {\n try {\n const tree = await client.getParameterTree({});\n setTreeData(tree as ParameterTreeNode[]);\n } catch (error) {\n toast.danger({\n title: \"Failed to refresh parameters\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n }, [client, toast]);\n\n // Load config value and history when selection changes\n const loadConfigDetails = useCallback(\n async (name: string) => {\n setLoadingConfig(true);\n setLoadingHistory(true);\n\n try {\n const [currentResponse, historyResponse] = await Promise.all([\n client.getCurrent({ params: { name } }),\n client.getHistory({ params: { name } }),\n ]);\n setConfigValue(currentResponse);\n setHistory(historyResponse.versions);\n } catch (error) {\n toast.danger({\n title: \"Failed to load configuration\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n setConfigValue(null);\n setHistory([]);\n } finally {\n setLoadingConfig(false);\n setLoadingHistory(false);\n }\n },\n [client, toast],\n );\n\n // Handle save\n const handleSave = useCallback(\n async (values: Record<string, unknown>) => {\n if (!selectedConfig || !configValue) return;\n\n setSaving(true);\n try {\n await client.createVersion({\n params: { name: selectedConfig },\n body: {\n content: values,\n schemaHash: \"\", // Schema hash is computed server-side when empty\n changeDescription: \"Updated via admin UI\",\n },\n });\n\n toast.success({\n title: \"Configuration saved\",\n message: `${selectedConfig} has been updated`,\n });\n\n // Reload details\n await loadConfigDetails(selectedConfig);\n } catch (error) {\n toast.danger({\n title: \"Failed to save configuration\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n throw error;\n } finally {\n setSaving(false);\n }\n },\n [client, selectedConfig, configValue, loadConfigDetails, toast],\n );\n\n // Load details when selection changes\n useEffect(() => {\n if (selectedConfig) {\n loadConfigDetails(selectedConfig);\n } else {\n setConfigValue(null);\n setHistory([]);\n }\n }, [selectedConfig, loadConfigDetails]);\n\n // Handle rollback\n const handleRollback = useCallback(\n async (version: number) => {\n if (!selectedConfig) return;\n\n try {\n await client.rollback({\n params: { name: selectedConfig },\n body: { targetVersion: version },\n });\n\n toast.success({\n title: \"Rollback successful\",\n message: `${selectedConfig} rolled back to version ${version}`,\n });\n\n // Reload details\n await loadConfigDetails(selectedConfig);\n } catch (error) {\n toast.danger({\n title: \"Rollback failed\",\n message: error instanceof Error ? error.message : \"Unknown error\",\n });\n }\n },\n [client, selectedConfig, loadConfigDetails, toast],\n );\n\n // Empty state when no configs exist\n if (treeData.length === 0) {\n return (\n <Flex flex={1} justify=\"center\" align=\"center\">\n <Flex direction=\"column\" align=\"center\" gap=\"xs\">\n <IconSettings\n size={48}\n stroke={1.5}\n color=\"var(--mantine-color-dimmed)\"\n />\n <Text c=\"dimmed\">No Parameters Found</Text>\n <Text size=\"xs\" c=\"dimmed\" ta=\"center\" maw={400}>\n Define parameters using the $parameter primitive to manage dynamic\n application settings. Parameters will appear here once created.\n </Text>\n </Flex>\n </Flex>\n );\n }\n\n return (\n <Flex flex={1} p=\"md\">\n <Card\n withBorder\n p={0}\n w={\"100%\"}\n style={{\n flexDirection: \"row\",\n }}\n >\n <ParameterTree\n treeData={treeData}\n selectedConfig={selectedConfig}\n onSelect={setSelectedConfig}\n onRefresh={handleRefresh}\n />\n\n {selectedConfig ? (\n <>\n <ParameterDetails\n selectedConfig={selectedConfig}\n configValue={configValue}\n loading={loadingConfig}\n saving={saving}\n onSave={handleSave}\n />\n\n <ParameterHistory\n selectedConfig={selectedConfig}\n history={history}\n loading={loadingHistory}\n onRollback={handleRollback}\n />\n </>\n ) : (\n <ParameterEmptyState />\n )}\n </Card>\n </Flex>\n );\n};\n\nexport default AdminParameters;\n"],"mappings":"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"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import { ActionButton, DataTable,
|
|
1
|
+
import { _ as ActionButton, r as DataTable, s as Text, u as Flex } from "./core-2xoLiT0o.js";
|
|
2
2
|
import { t } from "alepha";
|
|
3
|
+
import { useI18n } from "alepha/react/i18n";
|
|
4
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
+
import { useState } from "react";
|
|
3
6
|
import { IconDeviceDesktop, IconDeviceMobile, IconDeviceTablet, IconTrash } from "@tabler/icons-react";
|
|
4
7
|
import { useRouter } from "alepha/react/router";
|
|
5
|
-
import { Badge } from "@mantine/core";
|
|
6
|
-
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
7
8
|
import { useClient } from "alepha/react";
|
|
8
|
-
import { useI18n } from "alepha/react/i18n";
|
|
9
|
-
import { useState } from "react";
|
|
10
9
|
import { sessions } from "alepha/api/users";
|
|
11
10
|
|
|
12
11
|
//#region ../../src/admin/components/sessions/AdminSessions.tsx
|
|
@@ -67,7 +66,7 @@ const AdminSessions = (props) => {
|
|
|
67
66
|
value: (item) => /* @__PURE__ */ jsx(ActionButton, {
|
|
68
67
|
variant: "subtle",
|
|
69
68
|
size: "xs",
|
|
70
|
-
href: router.path("
|
|
69
|
+
href: router.path("adminUserProfile", { params: { userId: item.userId } }),
|
|
71
70
|
children: /* @__PURE__ */ jsxs(Text, {
|
|
72
71
|
size: "xs",
|
|
73
72
|
ff: "monospace",
|
|
@@ -80,14 +79,9 @@ const AdminSessions = (props) => {
|
|
|
80
79
|
fit: true,
|
|
81
80
|
value: (item) => /* @__PURE__ */ jsx(Flex, {
|
|
82
81
|
gap: 4,
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
variant: "light",
|
|
86
|
-
leftSection: getDeviceIcon(item.userAgent.device),
|
|
87
|
-
children: item.userAgent.device
|
|
88
|
-
}), /* @__PURE__ */ jsxs(Text, {
|
|
82
|
+
align: "center",
|
|
83
|
+
children: item.userAgent ? /* @__PURE__ */ jsxs(Fragment, { children: [getDeviceIcon(item.userAgent.device), /* @__PURE__ */ jsxs(Text, {
|
|
89
84
|
size: "xs",
|
|
90
|
-
c: "dimmed",
|
|
91
85
|
children: [
|
|
92
86
|
item.userAgent.browser,
|
|
93
87
|
" / ",
|
|
@@ -113,10 +107,9 @@ const AdminSessions = (props) => {
|
|
|
113
107
|
expiresAt: {
|
|
114
108
|
label: "Status",
|
|
115
109
|
fit: true,
|
|
116
|
-
value: (item) => /* @__PURE__ */ jsx(
|
|
117
|
-
size: "
|
|
118
|
-
|
|
119
|
-
color: isExpired(item.expiresAt) ? "red" : "green",
|
|
110
|
+
value: (item) => /* @__PURE__ */ jsx(Text, {
|
|
111
|
+
size: "xs",
|
|
112
|
+
c: isExpired(item.expiresAt) ? "dimmed" : void 0,
|
|
120
113
|
children: isExpired(item.expiresAt) ? "Expired" : "Active"
|
|
121
114
|
})
|
|
122
115
|
},
|
|
@@ -147,4 +140,4 @@ const AdminSessions = (props) => {
|
|
|
147
140
|
|
|
148
141
|
//#endregion
|
|
149
142
|
export { AdminSessions as default };
|
|
150
|
-
//# sourceMappingURL=AdminSessions-
|
|
143
|
+
//# sourceMappingURL=AdminSessions-BhGJPI3z.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AdminSessions-BhGJPI3z.js","names":[],"sources":["../../src/admin/components/sessions/AdminSessions.tsx"],"sourcesContent":["import { ActionButton, DataTable, Flex, Text } from \"@alepha/ui\";\nimport {\n IconDeviceDesktop,\n IconDeviceMobile,\n IconDeviceTablet,\n IconTrash,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type AdminSessionController,\n type SessionEntity,\n sessions,\n} from \"alepha/api/users\";\nimport { useClient } from \"alepha/react\";\nimport { useI18n } from \"alepha/react/i18n\";\nimport { useRouter } from \"alepha/react/router\";\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<AdminSessionController>();\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(\"adminUserProfile\", {\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 <Flex gap={4} align=\"center\">\n {item.userAgent ? (\n <>\n {getDeviceIcon(item.userAgent.device)}\n <Text size=\"xs\">\n {item.userAgent.browser} / {item.userAgent.os}\n </Text>\n </>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n )}\n </Flex>\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 <Text\n size=\"xs\"\n c={isExpired(item.expiresAt) ? \"dimmed\" : undefined}\n >\n {isExpired(item.expiresAt) ? \"Expired\" : \"Active\"}\n </Text>\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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"}
|