@alepha/ui 0.18.2 → 0.19.0
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-BJhIwfD6.js → AdminApiKeys-Bt1PjO6o.js} +3 -4
- package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Bt1PjO6o.js.map} +1 -1
- package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-C7c1CN4c.js} +3 -4
- package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-C7c1CN4c.js.map} +1 -1
- package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-C3RXpTp6.js} +3 -4
- package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-C3RXpTp6.js.map} +1 -1
- package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-31ivR6Wq.js} +3 -4
- package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-31ivR6Wq.js.map} +1 -1
- package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BABLe7hL.js} +73 -25
- package/dist/admin/AdminJobDashboard-BABLe7hL.js.map +1 -0
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D-G8RIlr.js} +3 -4
- package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D-G8RIlr.js.map} +1 -1
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-oIS3K9NX.js} +3 -4
- package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-oIS3K9NX.js.map} +1 -1
- package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-BmZ9mtXh.js} +8 -25
- package/dist/admin/AdminLayout-BmZ9mtXh.js.map +1 -0
- package/dist/admin/AdminNotifications-DHdzksww.js +541 -0
- package/dist/admin/AdminNotifications-DHdzksww.js.map +1 -0
- package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CyZQSXnN.js} +118 -112
- package/dist/admin/AdminParameters-CyZQSXnN.js.map +1 -0
- package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions--xwELDSO.js} +3 -4
- package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions--xwELDSO.js.map} +1 -1
- package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-DvBTG5gd.js} +82 -115
- package/dist/admin/AdminUserLayout-DvBTG5gd.js.map +1 -0
- package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-CzsPBl6Z.js} +7 -6
- package/dist/admin/AdminUserProfile-CzsPBl6Z.js.map +1 -0
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-C-aUnhVN.js} +3 -4
- package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-C-aUnhVN.js.map} +1 -1
- package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-BYwei5sj.js} +4 -4
- package/dist/admin/AdminUsers-BYwei5sj.js.map +1 -0
- package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-CkPGLJku.js} +3 -4
- package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-CkPGLJku.js.map} +1 -1
- package/dist/{demo/IconGoogle-CSQLPYwX.js → admin/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/admin/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/admin/Login-DSBqNsZc.js +274 -0
- package/dist/admin/Login-DSBqNsZc.js.map +1 -0
- package/dist/admin/{Profile-B2EcIDB9.js → Profile-CDRjJo0P.js} +31 -29
- package/dist/admin/Profile-CDRjJo0P.js.map +1 -0
- package/dist/admin/{Register-Z3fxRbUF.js → Register-4QGFOnfh.js} +201 -146
- package/dist/admin/Register-4QGFOnfh.js.map +1 -0
- package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-Gxc9L_mY.js} +9 -10
- package/dist/admin/ResetPassword-Gxc9L_mY.js.map +1 -0
- package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-D7G5NnaN.js} +25 -11
- package/dist/admin/VerifyEmail-D7G5NnaN.js.map +1 -0
- package/dist/admin/adminUserAtom-DCi4wf-v.js +11 -0
- package/dist/admin/adminUserAtom-DCi4wf-v.js.map +1 -0
- package/dist/admin/{core-BVO_TQxb.js → core-D1AbU50V.js} +662 -570
- package/dist/admin/core-D1AbU50V.js.map +1 -0
- package/dist/admin/index.d.ts +141 -53
- package/dist/admin/index.d.ts.map +1 -1
- package/dist/admin/index.js +67 -49
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/{demo/AuthLayout-DN-ClJQk.js → auth/AuthLayout-CfRKcTqP.js} +3 -4
- package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-CfRKcTqP.js.map} +1 -1
- package/dist/{admin/IconGoogle-Ch1m3Uzl.js → auth/IconGoogle-8Nkx6yax.js} +2 -4
- package/dist/auth/{IconGoogle-Ch1m3Uzl.js.map → IconGoogle-8Nkx6yax.js.map} +1 -1
- package/dist/auth/Login-DJyweoPS.js +274 -0
- package/dist/auth/Login-DJyweoPS.js.map +1 -0
- package/dist/auth/{Profile-BMpXJ0oi.js → Profile-Cy93pNTw.js} +31 -29
- package/dist/auth/Profile-Cy93pNTw.js.map +1 -0
- package/dist/auth/{Register-2gx8qll-.js → Register-CSqzzitW.js} +201 -146
- package/dist/auth/Register-CSqzzitW.js.map +1 -0
- package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-B61QPlQi.js} +9 -10
- package/dist/auth/ResetPassword-B61QPlQi.js.map +1 -0
- package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-CqBJ11id.js} +25 -11
- package/dist/auth/VerifyEmail-CqBJ11id.js.map +1 -0
- package/dist/auth/{core-DyfeVr5c.js → core-C6D3pazL.js} +403 -343
- package/dist/auth/core-C6D3pazL.js.map +1 -0
- package/dist/auth/index.d.ts +93 -54
- package/dist/auth/index.d.ts.map +1 -1
- package/dist/auth/index.js +30 -31
- package/dist/auth/index.js.map +1 -1
- package/dist/auth/rolldown-runtime-CiIaOW0V.js +13 -0
- package/dist/core/index.d.ts +123 -62
- package/dist/core/index.d.ts.map +1 -1
- package/dist/core/index.js +878 -776
- package/dist/core/index.js.map +1 -1
- package/dist/{auth/AuthLayout-C161NeF6.js → demo/AuthLayout-Dq5tSLSc.js} +3 -4
- package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Dq5tSLSc.js.map} +1 -1
- package/dist/demo/DemoButton-_Ws2w-J0.js +181 -0
- package/dist/demo/DemoButton-_Ws2w-J0.js.map +1 -0
- package/dist/demo/DemoControlSelect-ChP4ZOpQ.js +304 -0
- package/dist/demo/DemoControlSelect-ChP4ZOpQ.js.map +1 -0
- package/dist/demo/DemoDataTable-Hwf_UUni.js +361 -0
- package/dist/demo/DemoDataTable-Hwf_UUni.js.map +1 -0
- package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-B01OMVRd.js} +3 -4
- package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-B01OMVRd.js.map} +1 -1
- package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-870PEl0V.js} +4 -5
- package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-870PEl0V.js.map} +1 -1
- package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C1YR27fz.js} +4 -5
- package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C1YR27fz.js.map} +1 -1
- package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-DRbL2eGf.js} +4 -5
- package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-DRbL2eGf.js.map} +1 -1
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-DoABiqBW.js} +4 -5
- package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-DoABiqBW.js.map} +1 -1
- package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CN_PDCX2.js} +16 -8
- package/dist/demo/DemoLayout-CN_PDCX2.js.map +1 -0
- package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-B5x-ug3Q.js} +51 -35
- package/dist/demo/DemoLogin-B5x-ug3Q.js.map +1 -0
- package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-Q6sg2xuV.js} +51 -53
- package/dist/demo/DemoRegister-Q6sg2xuV.js.map +1 -0
- package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-DrqZfmEw.js} +14 -19
- package/dist/demo/DemoResetPassword-DrqZfmEw.js.map +1 -0
- package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-CfKS6w1o.js} +4 -5
- package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-CfKS6w1o.js.map} +1 -1
- package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-pT6Gi5b5.js} +4 -5
- package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-pT6Gi5b5.js.map} +1 -1
- package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-I13NBzQQ.js} +3 -4
- package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-I13NBzQQ.js.map} +1 -1
- package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-BqzcrtvN.js} +9 -6
- package/dist/demo/DemoTypeForm-BqzcrtvN.js.map +1 -0
- package/dist/demo/DemoVerifyEmail-HwD8xfQw.js +33 -0
- package/dist/demo/DemoVerifyEmail-HwD8xfQw.js.map +1 -0
- package/dist/{auth/IconGoogle-Ch1m3Uzl.js → demo/IconGoogle-CwQy4G9y.js} +2 -4
- package/dist/demo/{IconGoogle-CSQLPYwX.js.map → IconGoogle-CwQy4G9y.js.map} +1 -1
- package/dist/demo/Login-CqG1iJbn.js +274 -0
- package/dist/demo/Login-CqG1iJbn.js.map +1 -0
- package/dist/demo/{Profile-BE_Y3co2.js → Profile-C0ojJCaG.js} +31 -29
- package/dist/demo/Profile-C0ojJCaG.js.map +1 -0
- package/dist/demo/{Register-fXHmBpr3.js → Register-KKZwr_lL.js} +201 -146
- package/dist/demo/Register-KKZwr_lL.js.map +1 -0
- package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-DMrLFEtr.js} +9 -10
- package/dist/demo/ResetPassword-DMrLFEtr.js.map +1 -0
- package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D49Wud2v.js} +65 -68
- package/dist/demo/Showcase-D49Wud2v.js.map +1 -0
- package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BFCAFz6T.js} +25 -11
- package/dist/demo/VerifyEmail-BFCAFz6T.js.map +1 -0
- package/dist/demo/{auth-Djd7SKiw.js → auth-D9qTZzCa.js} +18 -35
- package/dist/demo/{auth-Djd7SKiw.js.map → auth-D9qTZzCa.js.map} +1 -1
- package/dist/demo/{core-B7LNjM78.js → core-DRtQklr3.js} +752 -647
- package/dist/demo/core-DRtQklr3.js.map +1 -0
- package/dist/demo/index.d.ts +1 -0
- package/dist/demo/index.d.ts.map +1 -1
- package/dist/demo/index.js +25 -22
- package/dist/demo/index.js.map +1 -1
- package/dist/demo/rolldown-runtime-CiIaOW0V.js +13 -0
- package/package.json +19 -19
- package/src/admin/AdminRouter.tsx +42 -2
- package/src/admin/atoms/adminUserAtom.ts +7 -0
- package/src/admin/components/AdminLayout.tsx +2 -14
- package/src/admin/components/jobs/AdminJobDashboard.tsx +51 -20
- package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
- package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
- package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
- package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
- package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
- package/src/admin/components/parameters/ParameterTree.tsx +28 -184
- package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
- package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
- package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
- package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
- package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
- package/src/admin/components/users/AdminUserLayout.tsx +84 -127
- package/src/admin/components/users/AdminUserProfile.tsx +5 -2
- package/src/admin/components/users/AdminUsers.tsx +1 -1
- package/src/auth/components/Login.tsx +188 -121
- package/src/auth/components/Profile.tsx +1 -22
- package/src/auth/components/ProfileField.tsx +39 -0
- package/src/auth/components/Register.tsx +215 -158
- package/src/auth/components/ResetPassword.tsx +7 -11
- package/src/auth/components/VerifyEmail.tsx +35 -10
- package/src/auth/components/buttons/UserButton.tsx +19 -21
- package/src/auth/index.ts +1 -0
- package/src/core/components/Flex.tsx +34 -0
- package/src/core/components/buttons/ActionButton.tsx +105 -78
- package/src/core/components/data/DetailDrawer.tsx +102 -96
- package/src/core/components/data/DetailList.tsx +2 -1
- package/src/core/components/dialogs/PromptDialog.tsx +1 -1
- package/src/core/components/layout/Breadcrumb.tsx +4 -7
- package/src/core/components/layout/DashboardShell.tsx +18 -4
- package/src/core/components/layout/Sidebar.tsx +16 -241
- package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
- package/src/core/components/layout/SidebarItem.tsx +146 -0
- package/src/core/components/layout/index.ts +3 -1
- package/src/core/form/components/Control.tsx +31 -29
- package/src/core/form/components/ControlArray.tsx +13 -39
- package/src/core/form/components/ControlDate.tsx +10 -21
- package/src/core/form/components/ControlNumber.tsx +4 -33
- package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
- package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
- package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
- package/src/core/form/components/ControlSelect.tsx +294 -92
- package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
- package/src/core/form/components/TypeForm.tsx +5 -2
- package/src/core/form/index.ts +8 -1
- package/src/core/form/utils/parseInput.ts +7 -3
- package/src/core/index.ts +3 -1
- package/src/core/json/components/JsonViewer.tsx +103 -319
- package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
- package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
- package/src/core/json/components/JsonViewerShared.ts +76 -0
- package/src/core/services/DialogService.tsx +2 -2
- package/src/core/styles.css +13 -2
- package/src/core/table/components/ColumnPicker.tsx +3 -3
- package/src/core/table/components/DataTable.tsx +88 -29
- package/src/core/table/components/DataTableFilters.tsx +6 -11
- package/src/core/table/components/DataTablePagination.tsx +9 -3
- package/src/core/table/components/DataTableToolbar.tsx +7 -3
- package/src/core/table/components/FilterPicker.tsx +3 -3
- package/src/core/table/interfaces/types.ts +29 -0
- package/src/core/utils/icons.tsx +2 -2
- package/src/demo/DemoRouter.ts +8 -1
- package/src/demo/components/DemoLayout.tsx +12 -2
- package/src/demo/components/auth/DemoLogin.tsx +35 -28
- package/src/demo/components/auth/DemoRegister.tsx +35 -49
- package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
- package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
- package/src/demo/components/core/DemoButton.tsx +123 -103
- package/src/demo/components/core/DemoControlSelect.tsx +325 -0
- package/src/demo/components/core/DemoDataTable.tsx +255 -237
- package/src/demo/components/core/DemoTypeForm.tsx +7 -2
- package/src/demo/components/shared/MacWindow.tsx +5 -11
- package/src/demo/components/shared/Showcase.tsx +28 -42
- package/dist/admin/AdminJobDashboard-KIOkeMgE.js.map +0 -1
- package/dist/admin/AdminLayout-B1DXZHDn.js.map +0 -1
- package/dist/admin/AdminParameters-BspPeqp_.js.map +0 -1
- package/dist/admin/AdminUserLayout-DUbC6-BI.js.map +0 -1
- package/dist/admin/AdminUserProfile-DuTUnjdG.js.map +0 -1
- package/dist/admin/AdminUsers-CR9z0g_5.js.map +0 -1
- package/dist/admin/Login-DHbYJKwg.js +0 -219
- package/dist/admin/Login-DHbYJKwg.js.map +0 -1
- package/dist/admin/Profile-B2EcIDB9.js.map +0 -1
- package/dist/admin/Register-Z3fxRbUF.js.map +0 -1
- package/dist/admin/ResetPassword-_Y1qTTKh.js.map +0 -1
- package/dist/admin/VerifyEmail-Bg22bwcC.js.map +0 -1
- package/dist/admin/core-BVO_TQxb.js.map +0 -1
- package/dist/admin/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/auth/Login-C7jIqf00.js +0 -219
- package/dist/auth/Login-C7jIqf00.js.map +0 -1
- package/dist/auth/Profile-BMpXJ0oi.js.map +0 -1
- package/dist/auth/Register-2gx8qll-.js.map +0 -1
- package/dist/auth/ResetPassword-DBxt9hKk.js.map +0 -1
- package/dist/auth/VerifyEmail-Z80Ubajk.js.map +0 -1
- package/dist/auth/core-DyfeVr5c.js.map +0 -1
- package/dist/auth/rolldown-runtime-CjeV3_4I.js +0 -18
- package/dist/demo/DemoButton-CGUyR9eM.js +0 -178
- package/dist/demo/DemoButton-CGUyR9eM.js.map +0 -1
- package/dist/demo/DemoDataTable-QFG-xXSx.js +0 -358
- package/dist/demo/DemoDataTable-QFG-xXSx.js.map +0 -1
- package/dist/demo/DemoLayout-Cy6xjn6P.js.map +0 -1
- package/dist/demo/DemoLogin-vqxgTu4P.js.map +0 -1
- package/dist/demo/DemoRegister-YHPvPg77.js.map +0 -1
- package/dist/demo/DemoResetPassword-mOW18Zlm.js.map +0 -1
- package/dist/demo/DemoTypeForm-C1dNkahD.js.map +0 -1
- package/dist/demo/DemoVerifyEmail-D9EcXZ38.js +0 -30
- package/dist/demo/DemoVerifyEmail-D9EcXZ38.js.map +0 -1
- package/dist/demo/Login-CoYf_P_F.js +0 -219
- package/dist/demo/Login-CoYf_P_F.js.map +0 -1
- package/dist/demo/Profile-BE_Y3co2.js.map +0 -1
- package/dist/demo/Register-fXHmBpr3.js.map +0 -1
- package/dist/demo/ResetPassword-CAPj8MO3.js.map +0 -1
- package/dist/demo/Showcase-BtEU0pY9.js.map +0 -1
- package/dist/demo/VerifyEmail-DFmdCdYs.js.map +0 -1
- package/dist/demo/core-B7LNjM78.js.map +0 -1
- package/dist/demo/rolldown-runtime-CjeV3_4I.js +0 -18
- package/src/demo/styles.css +0 -0
|
@@ -19,7 +19,7 @@ import type {
|
|
|
19
19
|
DateTimePickerProps,
|
|
20
20
|
TimeInputProps,
|
|
21
21
|
} from "@mantine/dates";
|
|
22
|
-
import { useFormState } from "alepha/react/form";
|
|
22
|
+
import { useFieldValue, useFormState } from "alepha/react/form";
|
|
23
23
|
import type { ComponentType } from "react";
|
|
24
24
|
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
25
25
|
import ControlArray, { type ControlArrayProps } from "./ControlArray.tsx";
|
|
@@ -76,6 +76,7 @@ export interface ControlProps extends GenericControlProps {
|
|
|
76
76
|
*/
|
|
77
77
|
const Control = (_props: ControlProps) => {
|
|
78
78
|
const form = useFormState(_props.input, ["error"]);
|
|
79
|
+
const [value, setValue] = useFieldValue(_props.input);
|
|
79
80
|
|
|
80
81
|
// Early return if input is not properly initialized
|
|
81
82
|
if (!_props.input?.props) {
|
|
@@ -93,12 +94,11 @@ const Control = (_props: ControlProps) => {
|
|
|
93
94
|
if (props.query) {
|
|
94
95
|
return (
|
|
95
96
|
<ControlQueryBuilder
|
|
96
|
-
{...props.input.props}
|
|
97
97
|
{...inputProps}
|
|
98
98
|
schema={props.query}
|
|
99
|
-
value={
|
|
100
|
-
onChange={(
|
|
101
|
-
|
|
99
|
+
value={value}
|
|
100
|
+
onChange={(val) => {
|
|
101
|
+
setValue(val);
|
|
102
102
|
}}
|
|
103
103
|
/>
|
|
104
104
|
);
|
|
@@ -112,9 +112,9 @@ const Control = (_props: ControlProps) => {
|
|
|
112
112
|
<Input.Wrapper {...inputProps}>
|
|
113
113
|
<Flex flex={1} mt={"calc(var(--mantine-spacing-xs) / 2)"}>
|
|
114
114
|
<Custom
|
|
115
|
-
|
|
116
|
-
onChange={(
|
|
117
|
-
|
|
115
|
+
value={value}
|
|
116
|
+
onChange={(val) => {
|
|
117
|
+
setValue(val);
|
|
118
118
|
}}
|
|
119
119
|
/>
|
|
120
120
|
</Flex>
|
|
@@ -137,7 +137,7 @@ const Control = (_props: ControlProps) => {
|
|
|
137
137
|
return (
|
|
138
138
|
<ControlObject
|
|
139
139
|
input={props.input}
|
|
140
|
-
|
|
140
|
+
label={props.label}
|
|
141
141
|
description={props.description}
|
|
142
142
|
{...controlObjectProps}
|
|
143
143
|
/>
|
|
@@ -165,7 +165,7 @@ const Control = (_props: ControlProps) => {
|
|
|
165
165
|
return (
|
|
166
166
|
<ControlArray
|
|
167
167
|
input={props.input}
|
|
168
|
-
|
|
168
|
+
label={props.label}
|
|
169
169
|
description={props.description}
|
|
170
170
|
{...controlArrayProps}
|
|
171
171
|
/>
|
|
@@ -176,7 +176,8 @@ const Control = (_props: ControlProps) => {
|
|
|
176
176
|
//region <NumberInput/>
|
|
177
177
|
if (
|
|
178
178
|
props.number ||
|
|
179
|
-
(props.
|
|
179
|
+
(!props.select &&
|
|
180
|
+
props.input.schema &&
|
|
180
181
|
"type" in props.input.schema &&
|
|
181
182
|
(props.input.schema.type === "number" ||
|
|
182
183
|
props.input.schema.type === "integer"))
|
|
@@ -190,7 +191,7 @@ const Control = (_props: ControlProps) => {
|
|
|
190
191
|
<ControlNumber
|
|
191
192
|
size={props.size}
|
|
192
193
|
input={props.input}
|
|
193
|
-
|
|
194
|
+
label={props.label}
|
|
194
195
|
description={props.description}
|
|
195
196
|
icon={icon}
|
|
196
197
|
{...controlNumberProps}
|
|
@@ -208,9 +209,7 @@ const Control = (_props: ControlProps) => {
|
|
|
208
209
|
size={props.size}
|
|
209
210
|
id={id}
|
|
210
211
|
leftSection={icon}
|
|
211
|
-
onChange={(file) =>
|
|
212
|
-
props.input.set(file);
|
|
213
|
-
}}
|
|
212
|
+
onChange={(file) => setValue(file)}
|
|
214
213
|
{...fileInputProps}
|
|
215
214
|
/>
|
|
216
215
|
);
|
|
@@ -226,7 +225,8 @@ const Control = (_props: ControlProps) => {
|
|
|
226
225
|
size={props.size}
|
|
227
226
|
id={id}
|
|
228
227
|
leftSection={icon}
|
|
229
|
-
{
|
|
228
|
+
value={value ?? ""}
|
|
229
|
+
onChange={(val) => setValue(val)}
|
|
230
230
|
{...colorInputProps}
|
|
231
231
|
/>
|
|
232
232
|
);
|
|
@@ -244,13 +244,13 @@ const Control = (_props: ControlProps) => {
|
|
|
244
244
|
if (isEnum || (isArray && !isArrayOfObjects) || props.select) {
|
|
245
245
|
const opts = typeof props.select === "object" ? props.select : {};
|
|
246
246
|
if (props.segmented) {
|
|
247
|
-
opts.
|
|
247
|
+
opts.segmentedProps ??= {};
|
|
248
248
|
}
|
|
249
249
|
return (
|
|
250
250
|
<ControlSelect
|
|
251
251
|
size={props.size}
|
|
252
252
|
input={props.input}
|
|
253
|
-
|
|
253
|
+
label={props.label}
|
|
254
254
|
description={props.description}
|
|
255
255
|
icon={icon}
|
|
256
256
|
{...opts}
|
|
@@ -273,9 +273,9 @@ const Control = (_props: ControlProps) => {
|
|
|
273
273
|
size={props.size}
|
|
274
274
|
id={id}
|
|
275
275
|
color={"blue"}
|
|
276
|
-
|
|
276
|
+
checked={Boolean(value)}
|
|
277
277
|
onChange={(event) => {
|
|
278
|
-
|
|
278
|
+
setValue(event.currentTarget.checked);
|
|
279
279
|
}}
|
|
280
280
|
{...switchProps}
|
|
281
281
|
/>
|
|
@@ -284,7 +284,7 @@ const Control = (_props: ControlProps) => {
|
|
|
284
284
|
|
|
285
285
|
const opts: ControlSelectProps = {
|
|
286
286
|
input: props.input,
|
|
287
|
-
|
|
287
|
+
selectProps: {
|
|
288
288
|
data: [
|
|
289
289
|
{ value: "true", label: "Yes" },
|
|
290
290
|
{ value: "false", label: "No" },
|
|
@@ -295,7 +295,7 @@ const Control = (_props: ControlProps) => {
|
|
|
295
295
|
return (
|
|
296
296
|
<ControlSelect
|
|
297
297
|
size={props.size}
|
|
298
|
-
|
|
298
|
+
label={props.label}
|
|
299
299
|
description={props.description}
|
|
300
300
|
icon={icon}
|
|
301
301
|
{...opts}
|
|
@@ -314,7 +314,8 @@ const Control = (_props: ControlProps) => {
|
|
|
314
314
|
size={props.size}
|
|
315
315
|
id={id}
|
|
316
316
|
leftSection={icon}
|
|
317
|
-
{
|
|
317
|
+
value={value ?? ""}
|
|
318
|
+
onChange={(ev) => setValue(ev.target.value)}
|
|
318
319
|
{...passwordInputProps}
|
|
319
320
|
/>
|
|
320
321
|
);
|
|
@@ -330,7 +331,8 @@ const Control = (_props: ControlProps) => {
|
|
|
330
331
|
size={props.size}
|
|
331
332
|
id={id}
|
|
332
333
|
leftSection={icon}
|
|
333
|
-
{
|
|
334
|
+
value={value ?? ""}
|
|
335
|
+
onChange={(ev) => setValue(ev.target.value)}
|
|
334
336
|
{...textAreaProps}
|
|
335
337
|
/>
|
|
336
338
|
);
|
|
@@ -351,7 +353,7 @@ const Control = (_props: ControlProps) => {
|
|
|
351
353
|
<ControlDate
|
|
352
354
|
size={props.size}
|
|
353
355
|
input={props.input}
|
|
354
|
-
|
|
356
|
+
label={props.label}
|
|
355
357
|
description={props.description}
|
|
356
358
|
icon={icon}
|
|
357
359
|
date={props.date}
|
|
@@ -377,7 +379,7 @@ const Control = (_props: ControlProps) => {
|
|
|
377
379
|
case "phone":
|
|
378
380
|
return "tel";
|
|
379
381
|
default:
|
|
380
|
-
return
|
|
382
|
+
return props.input.props.type ?? "text";
|
|
381
383
|
}
|
|
382
384
|
};
|
|
383
385
|
|
|
@@ -388,9 +390,9 @@ const Control = (_props: ControlProps) => {
|
|
|
388
390
|
id={id}
|
|
389
391
|
leftSection={icon}
|
|
390
392
|
type={getInputType()}
|
|
391
|
-
{
|
|
393
|
+
value={value ?? ""}
|
|
394
|
+
onChange={(ev) => setValue(ev.target.value)}
|
|
392
395
|
{...textInputProps}
|
|
393
|
-
inputWrapperOrder={["label", "input", "description", "error"]}
|
|
394
396
|
/>
|
|
395
397
|
);
|
|
396
398
|
//endregion
|
|
@@ -399,6 +401,6 @@ const Control = (_props: ControlProps) => {
|
|
|
399
401
|
export default Control;
|
|
400
402
|
|
|
401
403
|
export type CustomControlProps = {
|
|
402
|
-
|
|
404
|
+
value: any;
|
|
403
405
|
onChange: (value: any) => void;
|
|
404
406
|
};
|
|
@@ -88,11 +88,11 @@ const useArrayItems = (
|
|
|
88
88
|
const alepha = useAlepha();
|
|
89
89
|
const keyCounter = useRef(0);
|
|
90
90
|
|
|
91
|
-
// Initialize from
|
|
91
|
+
// Initialize from initialValue
|
|
92
92
|
const [items, setItemsState] = useState<ArrayItem[]>(() => {
|
|
93
|
-
const
|
|
94
|
-
if (Array.isArray(
|
|
95
|
-
return
|
|
93
|
+
const initial = input?.initialValue;
|
|
94
|
+
if (Array.isArray(initial)) {
|
|
95
|
+
return initial.map((value) => ({
|
|
96
96
|
key: keyCounter.current++,
|
|
97
97
|
value,
|
|
98
98
|
}));
|
|
@@ -126,46 +126,20 @@ const useArrayItems = (
|
|
|
126
126
|
});
|
|
127
127
|
}, []);
|
|
128
128
|
|
|
129
|
-
// Listen for form changes
|
|
129
|
+
// Listen for form changes
|
|
130
130
|
useEffect(() => {
|
|
131
131
|
if (!input?.form) return;
|
|
132
132
|
|
|
133
133
|
const formId = input.form.id;
|
|
134
134
|
const fieldPath = input.path;
|
|
135
135
|
|
|
136
|
-
const
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
if (event.id === formId) {
|
|
140
|
-
const defaultValue = input.props?.defaultValue;
|
|
141
|
-
keyCounter.current = 0;
|
|
142
|
-
if (Array.isArray(defaultValue)) {
|
|
143
|
-
setItemsState(
|
|
144
|
-
defaultValue.map((value) => ({
|
|
145
|
-
key: keyCounter.current++,
|
|
146
|
-
value,
|
|
147
|
-
})),
|
|
148
|
-
);
|
|
149
|
-
} else {
|
|
150
|
-
setItemsState([]);
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
}),
|
|
154
|
-
|
|
155
|
-
// Handle external value changes (e.g., programmatic updates)
|
|
156
|
-
alepha.events.on("form:change", (event) => {
|
|
157
|
-
if (event.id === formId && event.path === fieldPath) {
|
|
158
|
-
// Value was changed externally, sync our state
|
|
159
|
-
syncFromFormValue(event.value);
|
|
160
|
-
}
|
|
161
|
-
}),
|
|
162
|
-
];
|
|
163
|
-
|
|
164
|
-
return () => {
|
|
165
|
-
for (const unsub of listeners) {
|
|
166
|
-
unsub();
|
|
136
|
+
const unsub = alepha.events.on("form:change", (event) => {
|
|
137
|
+
if (event.id === formId && event.path === fieldPath) {
|
|
138
|
+
syncFromFormValue(event.value);
|
|
167
139
|
}
|
|
168
|
-
};
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
return unsub;
|
|
169
143
|
}, [alepha, input, syncFromFormValue]);
|
|
170
144
|
|
|
171
145
|
// Update form when items change
|
|
@@ -200,10 +174,10 @@ const createArrayItemInput = (
|
|
|
200
174
|
path: `${parentInput.path}/${index}`,
|
|
201
175
|
required: false,
|
|
202
176
|
form: parentInput.form,
|
|
177
|
+
initialValue: value,
|
|
203
178
|
props: {
|
|
204
179
|
id: `${parentInput.props.id}-${index}`,
|
|
205
180
|
name: `${parentInput.props.name}[${index}]`,
|
|
206
|
-
defaultValue: value,
|
|
207
181
|
},
|
|
208
182
|
set: onValueChange,
|
|
209
183
|
};
|
|
@@ -228,10 +202,10 @@ const createArrayItemFieldInput = (
|
|
|
228
202
|
path: `${parentInput.path}/${index}/${fieldName}`,
|
|
229
203
|
required: itemSchema.required?.includes(fieldName) ?? false,
|
|
230
204
|
form: parentInput.form,
|
|
205
|
+
initialValue: itemValue?.[fieldName],
|
|
231
206
|
props: {
|
|
232
207
|
id: `${parentInput.props.id}-${index}-${fieldName}`,
|
|
233
208
|
name: `${parentInput.props.name}[${index}].${fieldName}`,
|
|
234
|
-
defaultValue: itemValue?.[fieldName],
|
|
235
209
|
},
|
|
236
210
|
set: (value: any) => onFieldChange(fieldName, value),
|
|
237
211
|
};
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
TimeInput,
|
|
7
7
|
type TimeInputProps,
|
|
8
8
|
} from "@mantine/dates";
|
|
9
|
-
import { useFormState } from "alepha/react/form";
|
|
9
|
+
import { useFieldValue, useFormState } from "alepha/react/form";
|
|
10
10
|
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
11
11
|
|
|
12
12
|
export interface ControlDateProps extends GenericControlProps {
|
|
@@ -27,6 +27,7 @@ export interface ControlDateProps extends GenericControlProps {
|
|
|
27
27
|
*/
|
|
28
28
|
const ControlDate = (props: ControlDateProps) => {
|
|
29
29
|
const form = useFormState(props.input);
|
|
30
|
+
const [value, setValue] = useFieldValue(props.input);
|
|
30
31
|
const { inputProps, id, icon, format } = parseInput(props, form);
|
|
31
32
|
if (!props.input?.props) {
|
|
32
33
|
return null;
|
|
@@ -41,14 +42,10 @@ const ControlDate = (props: ControlDateProps) => {
|
|
|
41
42
|
{...inputProps}
|
|
42
43
|
id={id}
|
|
43
44
|
leftSection={icon}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
: undefined
|
|
45
|
+
value={value ? new Date(value) : null}
|
|
46
|
+
onChange={(val) =>
|
|
47
|
+
setValue(val ? new Date(val).toISOString() : undefined)
|
|
48
48
|
}
|
|
49
|
-
onChange={(value) => {
|
|
50
|
-
props.input.set(value ? new Date(value).toISOString() : undefined);
|
|
51
|
-
}}
|
|
52
49
|
{...dateTimePickerProps}
|
|
53
50
|
/>
|
|
54
51
|
);
|
|
@@ -63,16 +60,10 @@ const ControlDate = (props: ControlDateProps) => {
|
|
|
63
60
|
{...inputProps}
|
|
64
61
|
id={id}
|
|
65
62
|
leftSection={icon}
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
: undefined
|
|
63
|
+
value={value ? new Date(value) : null}
|
|
64
|
+
onChange={(val) =>
|
|
65
|
+
setValue(val ? new Date(val).toISOString().slice(0, 10) : undefined)
|
|
70
66
|
}
|
|
71
|
-
onChange={(value) => {
|
|
72
|
-
props.input.set(
|
|
73
|
-
value ? new Date(value).toISOString().slice(0, 10) : undefined,
|
|
74
|
-
);
|
|
75
|
-
}}
|
|
76
67
|
{...dateInputProps}
|
|
77
68
|
/>
|
|
78
69
|
);
|
|
@@ -87,10 +78,8 @@ const ControlDate = (props: ControlDateProps) => {
|
|
|
87
78
|
{...inputProps}
|
|
88
79
|
id={id}
|
|
89
80
|
leftSection={icon}
|
|
90
|
-
|
|
91
|
-
onChange={(event) =>
|
|
92
|
-
props.input.set(event.currentTarget.value);
|
|
93
|
-
}}
|
|
81
|
+
value={value ?? ""}
|
|
82
|
+
onChange={(event) => setValue(event.currentTarget.value)}
|
|
94
83
|
{...timeInputProps}
|
|
95
84
|
/>
|
|
96
85
|
);
|
|
@@ -5,9 +5,7 @@ import {
|
|
|
5
5
|
Slider,
|
|
6
6
|
type SliderProps,
|
|
7
7
|
} from "@mantine/core";
|
|
8
|
-
import {
|
|
9
|
-
import { useFormState } from "alepha/react/form";
|
|
10
|
-
import { useRef, useState } from "react";
|
|
8
|
+
import { useFieldValue, useFormState } from "alepha/react/form";
|
|
11
9
|
import { type GenericControlProps, parseInput } from "../utils/parseInput.ts";
|
|
12
10
|
|
|
13
11
|
export interface ControlNumberProps extends GenericControlProps {
|
|
@@ -20,32 +18,13 @@ export interface ControlNumberProps extends GenericControlProps {
|
|
|
20
18
|
*/
|
|
21
19
|
const ControlNumber = (props: ControlNumberProps) => {
|
|
22
20
|
const form = useFormState(props.input);
|
|
21
|
+
const [value, setValue] = useFieldValue(props.input);
|
|
23
22
|
const { inputProps, id, icon } = parseInput(props, form);
|
|
24
|
-
const ref = useRef<HTMLInputElement | null>(null);
|
|
25
|
-
|
|
26
|
-
// HTML Reset doesn't trigger on <NumberInput /> so we handle it manually
|
|
27
|
-
|
|
28
|
-
const [value, setValue] = useState<number | undefined>(
|
|
29
|
-
props.input.props.defaultValue,
|
|
30
|
-
);
|
|
31
|
-
|
|
32
|
-
useEvents(
|
|
33
|
-
{
|
|
34
|
-
"form:reset": (event) => {
|
|
35
|
-
if (event.id === props.input?.form.id && ref.current) {
|
|
36
|
-
setValue(props.input.props.defaultValue);
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
[props.input],
|
|
41
|
-
);
|
|
42
23
|
|
|
43
24
|
if (!props.input?.props) {
|
|
44
25
|
return null;
|
|
45
26
|
}
|
|
46
27
|
|
|
47
|
-
const { type, ...inputPropsWithoutType } = props.input.props;
|
|
48
|
-
|
|
49
28
|
if (props.sliderProps) {
|
|
50
29
|
const min = props.sliderProps.min ?? inputProps.minimum ?? 0;
|
|
51
30
|
const max = props.sliderProps.max ?? inputProps.maximum ?? 100;
|
|
@@ -59,18 +38,13 @@ const ControlNumber = (props: ControlNumberProps) => {
|
|
|
59
38
|
>
|
|
60
39
|
<Slider
|
|
61
40
|
{...inputProps}
|
|
62
|
-
ref={ref}
|
|
63
41
|
id={id}
|
|
64
|
-
{...inputPropsWithoutType}
|
|
65
42
|
{...props.sliderProps}
|
|
66
|
-
value={value}
|
|
43
|
+
value={value ?? 0}
|
|
67
44
|
min={min}
|
|
68
45
|
max={max}
|
|
69
46
|
label={() => value}
|
|
70
|
-
onChange={(val) =>
|
|
71
|
-
setValue(val);
|
|
72
|
-
props.input.set(val);
|
|
73
|
-
}}
|
|
47
|
+
onChange={(val) => setValue(val)}
|
|
74
48
|
/>
|
|
75
49
|
</div>
|
|
76
50
|
</Input.Wrapper>
|
|
@@ -80,16 +54,13 @@ const ControlNumber = (props: ControlNumberProps) => {
|
|
|
80
54
|
return (
|
|
81
55
|
<NumberInput
|
|
82
56
|
{...inputProps}
|
|
83
|
-
ref={ref}
|
|
84
57
|
id={id}
|
|
85
58
|
leftSection={icon}
|
|
86
|
-
{...inputPropsWithoutType}
|
|
87
59
|
{...props.numberInputProps}
|
|
88
60
|
value={value ?? ""}
|
|
89
61
|
onChange={(val) => {
|
|
90
62
|
const newValue = val !== null ? Number(val) : undefined;
|
|
91
63
|
setValue(newValue);
|
|
92
|
-
props.input.set(newValue);
|
|
93
64
|
}}
|
|
94
65
|
/>
|
|
95
66
|
);
|
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
import {
|
|
2
|
-
ActionButton,
|
|
3
|
-
extractSchemaFields,
|
|
4
|
-
OPERATOR_INFO,
|
|
5
|
-
type SchemaField,
|
|
6
|
-
ui,
|
|
7
|
-
} from "@alepha/ui";
|
|
1
|
+
import { extractSchemaFields, ui } from "@alepha/ui";
|
|
8
2
|
import {
|
|
9
3
|
ActionIcon,
|
|
10
|
-
Badge,
|
|
11
|
-
Divider,
|
|
12
|
-
Flex,
|
|
13
4
|
Popover,
|
|
14
|
-
Text,
|
|
15
5
|
TextInput,
|
|
16
6
|
type TextInputProps,
|
|
17
7
|
} from "@mantine/core";
|
|
@@ -20,6 +10,7 @@ import type { TObject } from "alepha";
|
|
|
20
10
|
import { parseQueryString } from "alepha/orm";
|
|
21
11
|
import { useEvents } from "alepha/react";
|
|
22
12
|
import { useRef, useState } from "react";
|
|
13
|
+
import ControlQueryBuilderHelp from "./ControlQueryBuilderHelp.tsx";
|
|
23
14
|
|
|
24
15
|
export interface ControlQueryBuilderProps
|
|
25
16
|
extends Omit<TextInputProps, "value" | "onChange"> {
|
|
@@ -33,13 +24,15 @@ export interface ControlQueryBuilderProps
|
|
|
33
24
|
* Query builder with text input and help popover.
|
|
34
25
|
* Generates query strings for parseQueryString syntax.
|
|
35
26
|
*/
|
|
36
|
-
const ControlQueryBuilder = ({
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
27
|
+
const ControlQueryBuilder = (props: ControlQueryBuilderProps) => {
|
|
28
|
+
const {
|
|
29
|
+
schema,
|
|
30
|
+
value = "",
|
|
31
|
+
onChange,
|
|
32
|
+
placeholder = "Enter query or click for assistance...",
|
|
33
|
+
...textInputProps
|
|
34
|
+
} = props;
|
|
35
|
+
|
|
43
36
|
const [helpOpened, setHelpOpened] = useState(false);
|
|
44
37
|
const [textValue, setTextValue] = useState(value);
|
|
45
38
|
const inputRef = useRef<HTMLInputElement>(null);
|
|
@@ -146,166 +139,10 @@ const ControlQueryBuilder = ({
|
|
|
146
139
|
backdropFilter: "blur(20px)",
|
|
147
140
|
}}
|
|
148
141
|
>
|
|
149
|
-
<
|
|
142
|
+
<ControlQueryBuilderHelp fields={fields} onInsert={handleInsert} />
|
|
150
143
|
</Popover.Dropdown>
|
|
151
144
|
</Popover>
|
|
152
145
|
);
|
|
153
146
|
};
|
|
154
147
|
|
|
155
|
-
// ---------------------------------------------------------------------------------------------------------------------
|
|
156
|
-
// Query Help Component
|
|
157
|
-
// ---------------------------------------------------------------------------------------------------------------------
|
|
158
|
-
|
|
159
|
-
interface QueryHelpProps {
|
|
160
|
-
fields: SchemaField[];
|
|
161
|
-
onInsert: (text: string) => void;
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function QueryHelp({ fields, onInsert }: QueryHelpProps) {
|
|
165
|
-
return (
|
|
166
|
-
<Flex
|
|
167
|
-
gap="md"
|
|
168
|
-
align="flex-start"
|
|
169
|
-
wrap="nowrap"
|
|
170
|
-
bg={ui.colors.surface}
|
|
171
|
-
p={"sm"}
|
|
172
|
-
bdrs={"sm"}
|
|
173
|
-
>
|
|
174
|
-
{/* Left Column: Operators */}
|
|
175
|
-
<Flex direction="column" gap="md" style={{ flex: 1 }}>
|
|
176
|
-
{/* Available Operators */}
|
|
177
|
-
<Flex direction="column" gap="xs">
|
|
178
|
-
<Text size="sm" fw={600}>
|
|
179
|
-
Operators
|
|
180
|
-
</Text>
|
|
181
|
-
<Flex direction="column" gap={4}>
|
|
182
|
-
{Object.entries(OPERATOR_INFO).map(([key, info]) => (
|
|
183
|
-
<Flex key={key} gap="xs" wrap="nowrap">
|
|
184
|
-
<ActionButton
|
|
185
|
-
px={"xs"}
|
|
186
|
-
size={"xs"}
|
|
187
|
-
h={24}
|
|
188
|
-
variant={"default"}
|
|
189
|
-
justify={"center"}
|
|
190
|
-
miw={48}
|
|
191
|
-
onClick={() => onInsert(info.symbol)}
|
|
192
|
-
>
|
|
193
|
-
{info.symbol}
|
|
194
|
-
</ActionButton>
|
|
195
|
-
<Text size="xs" c="dimmed" style={{ flex: 1 }}>
|
|
196
|
-
{info.label}
|
|
197
|
-
</Text>
|
|
198
|
-
</Flex>
|
|
199
|
-
))}
|
|
200
|
-
</Flex>
|
|
201
|
-
</Flex>
|
|
202
|
-
|
|
203
|
-
<Divider />
|
|
204
|
-
|
|
205
|
-
{/* Logic Operators */}
|
|
206
|
-
<Flex direction="column" gap="xs">
|
|
207
|
-
<Text size="sm" fw={600}>
|
|
208
|
-
Logic
|
|
209
|
-
</Text>
|
|
210
|
-
<Flex direction="column" gap={4}>
|
|
211
|
-
<Flex gap="xs" wrap="nowrap">
|
|
212
|
-
<ActionButton
|
|
213
|
-
px={"xs"}
|
|
214
|
-
size={"xs"}
|
|
215
|
-
h={24}
|
|
216
|
-
variant={"default"}
|
|
217
|
-
justify={"center"}
|
|
218
|
-
miw={48}
|
|
219
|
-
onClick={() => onInsert("&")}
|
|
220
|
-
>
|
|
221
|
-
&
|
|
222
|
-
</ActionButton>
|
|
223
|
-
<Text size="xs" c="dimmed">
|
|
224
|
-
AND
|
|
225
|
-
</Text>
|
|
226
|
-
</Flex>
|
|
227
|
-
<Flex gap="xs" wrap="nowrap">
|
|
228
|
-
<ActionButton
|
|
229
|
-
px={"xs"}
|
|
230
|
-
size={"xs"}
|
|
231
|
-
h={24}
|
|
232
|
-
variant={"default"}
|
|
233
|
-
justify={"center"}
|
|
234
|
-
miw={48}
|
|
235
|
-
onClick={() => onInsert("|")}
|
|
236
|
-
>
|
|
237
|
-
|
|
|
238
|
-
</ActionButton>
|
|
239
|
-
<Text size="xs" c="dimmed">
|
|
240
|
-
OR
|
|
241
|
-
</Text>
|
|
242
|
-
</Flex>
|
|
243
|
-
</Flex>
|
|
244
|
-
</Flex>
|
|
245
|
-
</Flex>
|
|
246
|
-
|
|
247
|
-
{/* Divider */}
|
|
248
|
-
{fields.length > 0 && <Divider orientation="vertical" />}
|
|
249
|
-
|
|
250
|
-
{/* Right Column: Fields */}
|
|
251
|
-
{fields.length > 0 && (
|
|
252
|
-
<Flex direction={"column"} gap="xs" style={{ flex: 2 }}>
|
|
253
|
-
<Text size="sm" fw={600}>
|
|
254
|
-
Fields
|
|
255
|
-
</Text>
|
|
256
|
-
<Flex
|
|
257
|
-
direction={"column"}
|
|
258
|
-
gap={4}
|
|
259
|
-
style={{ maxHeight: 300, overflowY: "auto" }}
|
|
260
|
-
>
|
|
261
|
-
{fields.map((field) => (
|
|
262
|
-
<Flex key={field.path} gap="xs" wrap="nowrap" align="flex-start">
|
|
263
|
-
<ActionButton
|
|
264
|
-
px={"xs"}
|
|
265
|
-
size={"xs"}
|
|
266
|
-
h={24}
|
|
267
|
-
variant={"default"}
|
|
268
|
-
justify={"end"}
|
|
269
|
-
miw={120}
|
|
270
|
-
onClick={() => onInsert(field.path)}
|
|
271
|
-
>
|
|
272
|
-
{field.path}
|
|
273
|
-
</ActionButton>
|
|
274
|
-
<Flex
|
|
275
|
-
mt={3}
|
|
276
|
-
direction={"column"}
|
|
277
|
-
gap={2}
|
|
278
|
-
style={{ flex: 1, minWidth: 0 }}
|
|
279
|
-
>
|
|
280
|
-
<Text size="xs" c="dimmed" lineClamp={1}>
|
|
281
|
-
{field.description || field.type}
|
|
282
|
-
</Text>
|
|
283
|
-
{field.enum && (
|
|
284
|
-
<Flex gap={0} wrap="wrap">
|
|
285
|
-
{field.enum.map((enumValue) => (
|
|
286
|
-
<ActionButton
|
|
287
|
-
px={"xs"}
|
|
288
|
-
size={"xs"}
|
|
289
|
-
h={24}
|
|
290
|
-
key={enumValue}
|
|
291
|
-
onClick={() => onInsert(enumValue)}
|
|
292
|
-
>
|
|
293
|
-
{enumValue}
|
|
294
|
-
</ActionButton>
|
|
295
|
-
))}
|
|
296
|
-
</Flex>
|
|
297
|
-
)}
|
|
298
|
-
</Flex>
|
|
299
|
-
<Badge size="xs" variant="light" style={{ flexShrink: 0 }}>
|
|
300
|
-
{field.type}
|
|
301
|
-
</Badge>
|
|
302
|
-
</Flex>
|
|
303
|
-
))}
|
|
304
|
-
</Flex>
|
|
305
|
-
</Flex>
|
|
306
|
-
)}
|
|
307
|
-
</Flex>
|
|
308
|
-
);
|
|
309
|
-
}
|
|
310
|
-
|
|
311
148
|
export default ControlQueryBuilder;
|