@maxal_studio/kratosjs-react 1.0.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/README.md +44 -0
- package/dist/FieldRenderer.d.ts +13 -0
- package/dist/FieldRenderer.js +62 -0
- package/dist/FormRenderer.d.ts +7 -0
- package/dist/FormRenderer.js +78 -0
- package/dist/TableRenderer.d.ts +2 -0
- package/dist/TableRenderer.js +1 -0
- package/dist/api/actionsApi.d.ts +23 -0
- package/dist/api/actionsApi.js +46 -0
- package/dist/api/authenticatedFetch.d.ts +8 -0
- package/dist/api/authenticatedFetch.js +31 -0
- package/dist/api/exportApi.d.ts +18 -0
- package/dist/api/exportApi.js +50 -0
- package/dist/api/http.d.ts +24 -0
- package/dist/api/http.js +52 -0
- package/dist/api/resourceApi.d.ts +37 -0
- package/dist/api/resourceApi.js +52 -0
- package/dist/api/tableApi.d.ts +83 -0
- package/dist/api/tableApi.js +51 -0
- package/dist/api/urls.d.ts +19 -0
- package/dist/api/urls.js +46 -0
- package/dist/app.d.ts +101 -0
- package/dist/app.js +89 -0
- package/dist/auth/AuthContext.d.ts +22 -0
- package/dist/auth/AuthContext.js +147 -0
- package/dist/auth/LoginPage.d.ts +10 -0
- package/dist/auth/LoginPage.js +179 -0
- package/dist/auth/ProtectedRoute.d.ts +12 -0
- package/dist/auth/ProtectedRoute.js +22 -0
- package/dist/auth/authApiClient.d.ts +24 -0
- package/dist/auth/authApiClient.js +95 -0
- package/dist/auth/types.d.ts +103 -0
- package/dist/auth/types.js +1 -0
- package/dist/components/ActionFormModal.d.ts +22 -0
- package/dist/components/ActionFormModal.js +8 -0
- package/dist/components/AdminPanel.d.ts +11 -0
- package/dist/components/AdminPanel.js +194 -0
- package/dist/components/Checkbox.d.ts +10 -0
- package/dist/components/Checkbox.js +8 -0
- package/dist/components/CheckboxField.d.ts +7 -0
- package/dist/components/CheckboxField.js +26 -0
- package/dist/components/ColorPickerField.d.ts +7 -0
- package/dist/components/ColorPickerField.js +26 -0
- package/dist/components/DateTimePickerField.d.ts +7 -0
- package/dist/components/DateTimePickerField.js +64 -0
- package/dist/components/FileUploadField.d.ts +9 -0
- package/dist/components/FileUploadField.js +478 -0
- package/dist/components/GlobalSearch.d.ts +22 -0
- package/dist/components/GlobalSearch.js +181 -0
- package/dist/components/GroupField.d.ts +7 -0
- package/dist/components/GroupField.js +23 -0
- package/dist/components/HiddenField.d.ts +3 -0
- package/dist/components/HiddenField.js +10 -0
- package/dist/components/ModalBreadcrumb.d.ts +5 -0
- package/dist/components/ModalBreadcrumb.js +33 -0
- package/dist/components/ModalDrawer.d.ts +15 -0
- package/dist/components/ModalDrawer.js +40 -0
- package/dist/components/RadioField.d.ts +7 -0
- package/dist/components/RadioField.js +26 -0
- package/dist/components/RepeaterField.d.ts +3 -0
- package/dist/components/RepeaterField.js +191 -0
- package/dist/components/ResourceModalRenderer.d.ts +10 -0
- package/dist/components/ResourceModalRenderer.js +80 -0
- package/dist/components/RichEditorField.d.ts +3 -0
- package/dist/components/RichEditorField.js +655 -0
- package/dist/components/SectionField.d.ts +9 -0
- package/dist/components/SectionField.js +111 -0
- package/dist/components/SelectField.d.ts +8 -0
- package/dist/components/SelectField.js +523 -0
- package/dist/components/TabsField.d.ts +10 -0
- package/dist/components/TabsField.js +214 -0
- package/dist/components/TagsInputField.d.ts +7 -0
- package/dist/components/TagsInputField.js +172 -0
- package/dist/components/TextInputField.d.ts +7 -0
- package/dist/components/TextInputField.js +44 -0
- package/dist/components/TextareaField.d.ts +7 -0
- package/dist/components/TextareaField.js +31 -0
- package/dist/components/ToggleField.d.ts +7 -0
- package/dist/components/ToggleField.js +57 -0
- package/dist/components/ViewModal.d.ts +25 -0
- package/dist/components/ViewModal.js +159 -0
- package/dist/components/blocks/BlockRenderer.d.ts +7 -0
- package/dist/components/blocks/BlockRenderer.js +36 -0
- package/dist/components/blocks/FormBlockRenderer.d.ts +6 -0
- package/dist/components/blocks/FormBlockRenderer.js +110 -0
- package/dist/components/blocks/TableBlockRenderer.d.ts +6 -0
- package/dist/components/blocks/TableBlockRenderer.js +12 -0
- package/dist/components/blocks/TabsBlockRenderer.d.ts +7 -0
- package/dist/components/blocks/TabsBlockRenderer.js +11 -0
- package/dist/components/blocks/WidgetBlockRenderer.d.ts +6 -0
- package/dist/components/blocks/WidgetBlockRenderer.js +11 -0
- package/dist/components/columns/CheckboxColumnComponent.d.ts +6 -0
- package/dist/components/columns/CheckboxColumnComponent.js +21 -0
- package/dist/components/columns/ColorColumnComponent.d.ts +3 -0
- package/dist/components/columns/ColorColumnComponent.js +11 -0
- package/dist/components/columns/DeeplinkWrapper.d.ts +15 -0
- package/dist/components/columns/DeeplinkWrapper.js +85 -0
- package/dist/components/columns/IconColumnComponent.d.ts +3 -0
- package/dist/components/columns/IconColumnComponent.js +52 -0
- package/dist/components/columns/ImageColumnComponent.d.ts +3 -0
- package/dist/components/columns/ImageColumnComponent.js +98 -0
- package/dist/components/columns/MediaColumnComponent.d.ts +3 -0
- package/dist/components/columns/MediaColumnComponent.js +160 -0
- package/dist/components/columns/SelectColumnComponent.d.ts +6 -0
- package/dist/components/columns/SelectColumnComponent.js +26 -0
- package/dist/components/columns/TagsColumnComponent.d.ts +3 -0
- package/dist/components/columns/TagsColumnComponent.js +18 -0
- package/dist/components/columns/TextColumnComponent.d.ts +11 -0
- package/dist/components/columns/TextColumnComponent.js +107 -0
- package/dist/components/columns/TextInputColumnComponent.d.ts +6 -0
- package/dist/components/columns/TextInputColumnComponent.js +18 -0
- package/dist/components/columns/ToggleColumnComponent.d.ts +6 -0
- package/dist/components/columns/ToggleColumnComponent.js +25 -0
- package/dist/components/columns/VideoColumnComponent.d.ts +3 -0
- package/dist/components/columns/VideoColumnComponent.js +125 -0
- package/dist/components/columns/ViewColumnComponent.d.ts +3 -0
- package/dist/components/columns/ViewColumnComponent.js +7 -0
- package/dist/components/errors/ErrorBoundary.d.ts +23 -0
- package/dist/components/errors/ErrorBoundary.js +33 -0
- package/dist/components/filters/CustomFilterComponent.d.ts +10 -0
- package/dist/components/filters/CustomFilterComponent.js +33 -0
- package/dist/components/filters/DateFilterComponent.d.ts +15 -0
- package/dist/components/filters/DateFilterComponent.js +132 -0
- package/dist/components/filters/QueryBuilderFilterComponent.d.ts +11 -0
- package/dist/components/filters/QueryBuilderFilterComponent.js +200 -0
- package/dist/components/layout/Header.d.ts +10 -0
- package/dist/components/layout/Header.js +70 -0
- package/dist/components/layout/PanelBrandMark.d.ts +8 -0
- package/dist/components/layout/PanelBrandMark.js +28 -0
- package/dist/components/layout/Sidebar.d.ts +35 -0
- package/dist/components/layout/Sidebar.js +125 -0
- package/dist/components/modals/RelationCreateModal.d.ts +19 -0
- package/dist/components/modals/RelationCreateModal.js +57 -0
- package/dist/components/modals/ResourceFormModal.d.ts +37 -0
- package/dist/components/modals/ResourceFormModal.js +44 -0
- package/dist/components/modals/useResourceForm.d.ts +40 -0
- package/dist/components/modals/useResourceForm.js +138 -0
- package/dist/components/modals/view/RecordActions.d.ts +17 -0
- package/dist/components/modals/view/RecordActions.js +16 -0
- package/dist/components/modals/view/RecordDetails.d.ts +13 -0
- package/dist/components/modals/view/RecordDetails.js +29 -0
- package/dist/components/modals/view/RelationPanel.d.ts +18 -0
- package/dist/components/modals/view/RelationPanel.js +16 -0
- package/dist/components/modals/view/RelationTabs.d.ts +32 -0
- package/dist/components/modals/view/RelationTabs.js +42 -0
- package/dist/components/modals/view/useRecordView.d.ts +18 -0
- package/dist/components/modals/view/useRecordView.js +114 -0
- package/dist/components/pages/PageRenderer.d.ts +6 -0
- package/dist/components/pages/PageRenderer.js +107 -0
- package/dist/components/table/ColumnTogglePopup.d.ts +11 -0
- package/dist/components/table/ColumnTogglePopup.js +16 -0
- package/dist/components/table/GridCard.d.ts +21 -0
- package/dist/components/table/GridCard.js +30 -0
- package/dist/components/table/GridView.d.ts +23 -0
- package/dist/components/table/GridView.js +49 -0
- package/dist/components/table/LayoutToggle.d.ts +7 -0
- package/dist/components/table/LayoutToggle.js +9 -0
- package/dist/components/table/TableActionsDropdown.d.ts +13 -0
- package/dist/components/table/TableActionsDropdown.js +46 -0
- package/dist/components/table/TableBulkActions.d.ts +11 -0
- package/dist/components/table/TableBulkActions.js +21 -0
- package/dist/components/table/TableHeader.d.ts +14 -0
- package/dist/components/table/TableHeader.js +23 -0
- package/dist/components/table/TablePagination.d.ts +13 -0
- package/dist/components/table/TablePagination.js +55 -0
- package/dist/components/table/TableRow.d.ts +21 -0
- package/dist/components/table/TableRow.js +32 -0
- package/dist/components/table/TableSearchBar.d.ts +11 -0
- package/dist/components/table/TableSearchBar.js +12 -0
- package/dist/components/table/TableTabs.d.ts +14 -0
- package/dist/components/table/TableTabs.js +8 -0
- package/dist/components/ui/Badge.d.ts +6 -0
- package/dist/components/ui/Badge.js +12 -0
- package/dist/components/ui/Button.d.ts +22 -0
- package/dist/components/ui/Button.js +22 -0
- package/dist/components/ui/Card.d.ts +7 -0
- package/dist/components/ui/Card.js +5 -0
- package/dist/components/ui/ConfirmDialog.d.ts +19 -0
- package/dist/components/ui/ConfirmDialog.js +45 -0
- package/dist/components/ui/EmptyState.d.ts +9 -0
- package/dist/components/ui/EmptyState.js +6 -0
- package/dist/components/ui/ErrorAlert.d.ts +7 -0
- package/dist/components/ui/ErrorAlert.js +9 -0
- package/dist/components/ui/Input.d.ts +11 -0
- package/dist/components/ui/Input.js +10 -0
- package/dist/components/ui/Label.d.ts +5 -0
- package/dist/components/ui/Label.js +5 -0
- package/dist/components/ui/PillButton.d.ts +14 -0
- package/dist/components/ui/PillButton.js +19 -0
- package/dist/components/ui/Select.d.ts +7 -0
- package/dist/components/ui/Select.js +7 -0
- package/dist/components/ui/Spinner.d.ts +8 -0
- package/dist/components/ui/Spinner.js +14 -0
- package/dist/components/ui/Toast.d.ts +21 -0
- package/dist/components/ui/Toast.js +47 -0
- package/dist/components/ui/index.d.ts +24 -0
- package/dist/components/ui/index.js +12 -0
- package/dist/components/utils/HintDisplay.d.ts +11 -0
- package/dist/components/utils/HintDisplay.js +12 -0
- package/dist/components/utils/Icon.d.ts +22 -0
- package/dist/components/utils/Icon.js +22 -0
- package/dist/components/utils/MediaPreviewModal.d.ts +14 -0
- package/dist/components/utils/MediaPreviewModal.js +32 -0
- package/dist/components/utils/ViewFieldWrapper.d.ts +11 -0
- package/dist/components/utils/ViewFieldWrapper.js +9 -0
- package/dist/components/utils/layoutHelpers.d.ts +19 -0
- package/dist/components/utils/layoutHelpers.js +257 -0
- package/dist/components/widgets/ChartWidget.d.ts +16 -0
- package/dist/components/widgets/ChartWidget.js +192 -0
- package/dist/components/widgets/StatsWidget.d.ts +16 -0
- package/dist/components/widgets/StatsWidget.js +39 -0
- package/dist/components/widgets/WidgetRenderer.d.ts +10 -0
- package/dist/components/widgets/WidgetRenderer.js +50 -0
- package/dist/components/widgets/WidgetShell.d.ts +9 -0
- package/dist/components/widgets/WidgetShell.js +7 -0
- package/dist/contexts/AuthChallengeRegistryContext.d.ts +15 -0
- package/dist/contexts/AuthChallengeRegistryContext.js +15 -0
- package/dist/contexts/BlockRegistryContext.d.ts +18 -0
- package/dist/contexts/BlockRegistryContext.js +8 -0
- package/dist/contexts/ColumnRegistryContext.d.ts +8 -0
- package/dist/contexts/ColumnRegistryContext.js +30 -0
- package/dist/contexts/FieldRegistryContext.d.ts +13 -0
- package/dist/contexts/FieldRegistryContext.js +46 -0
- package/dist/contexts/PanelMetadataContext.d.ts +26 -0
- package/dist/contexts/PanelMetadataContext.js +26 -0
- package/dist/contexts/PanelProviders.d.ts +27 -0
- package/dist/contexts/PanelProviders.js +24 -0
- package/dist/contexts/ResourceModalContext.d.ts +26 -0
- package/dist/contexts/ResourceModalContext.js +76 -0
- package/dist/contexts/SlotRegistryContext.d.ts +19 -0
- package/dist/contexts/SlotRegistryContext.js +24 -0
- package/dist/contexts/TableRefreshContext.d.ts +10 -0
- package/dist/contexts/TableRefreshContext.js +30 -0
- package/dist/contexts/WidgetRegistryContext.d.ts +17 -0
- package/dist/contexts/WidgetRegistryContext.js +14 -0
- package/dist/contexts/createRegistryContext.d.ts +19 -0
- package/dist/contexts/createRegistryContext.js +20 -0
- package/dist/hooks/useAfterStateUpdated.d.ts +6 -0
- package/dist/hooks/useAfterStateUpdated.js +62 -0
- package/dist/hooks/useValidation.d.ts +26 -0
- package/dist/hooks/useValidation.js +76 -0
- package/dist/i18n/I18nProvider.d.ts +27 -0
- package/dist/i18n/I18nProvider.js +101 -0
- package/dist/i18n/LocaleSwitcher.d.ts +10 -0
- package/dist/i18n/LocaleSwitcher.js +30 -0
- package/dist/i18n/activeLocale.d.ts +11 -0
- package/dist/i18n/activeLocale.js +34 -0
- package/dist/i18n/buildClientI18n.d.ts +28 -0
- package/dist/i18n/buildClientI18n.js +67 -0
- package/dist/i18n/index.d.ts +11 -0
- package/dist/i18n/index.js +9 -0
- package/dist/i18n/locales/core/en.d.ts +225 -0
- package/dist/i18n/locales/core/en.js +252 -0
- package/dist/i18n/locales/core/index.d.ts +2 -0
- package/dist/i18n/locales/core/index.js +4 -0
- package/dist/i18n/locales/core/sq.d.ts +253 -0
- package/dist/i18n/locales/core/sq.js +255 -0
- package/dist/i18n/useFormatter.d.ts +18 -0
- package/dist/i18n/useFormatter.js +37 -0
- package/dist/i18n/useLocale.d.ts +11 -0
- package/dist/i18n/useLocale.js +11 -0
- package/dist/i18n/useTranslation.d.ts +12 -0
- package/dist/i18n/useTranslation.js +12 -0
- package/dist/index.d.ts +106 -0
- package/dist/index.js +101 -0
- package/dist/pages/ResourceListPage.d.ts +8 -0
- package/dist/pages/ResourceListPage.js +139 -0
- package/dist/plugin.d.ts +79 -0
- package/dist/plugin.js +34 -0
- package/dist/runtime/conditions.d.ts +35 -0
- package/dist/runtime/conditions.js +97 -0
- package/dist/runtime/formTraversal.d.ts +25 -0
- package/dist/runtime/formTraversal.js +37 -0
- package/dist/runtime/serializedFunctions.d.ts +41 -0
- package/dist/runtime/serializedFunctions.js +264 -0
- package/dist/slots/Slot.d.ts +24 -0
- package/dist/slots/Slot.js +29 -0
- package/dist/slots/SlotCluster.d.ts +22 -0
- package/dist/slots/SlotCluster.js +49 -0
- package/dist/slots/index.d.ts +7 -0
- package/dist/slots/index.js +4 -0
- package/dist/slots/mergeSlots.d.ts +18 -0
- package/dist/slots/mergeSlots.js +35 -0
- package/dist/slots/types.d.ts +87 -0
- package/dist/slots/types.js +30 -0
- package/dist/styles.css +1 -0
- package/dist/table/TableContext.d.ts +36 -0
- package/dist/table/TableContext.js +13 -0
- package/dist/table/TableRenderer.d.ts +29 -0
- package/dist/table/TableRenderer.js +159 -0
- package/dist/table/components/FiltersPanel.d.ts +11 -0
- package/dist/table/components/FiltersPanel.js +52 -0
- package/dist/table/components/TableToolbar.d.ts +28 -0
- package/dist/table/components/TableToolbar.js +27 -0
- package/dist/table/components/TableToolbarButton.d.ts +6 -0
- package/dist/table/components/TableToolbarButton.js +9 -0
- package/dist/table/components/TableView.d.ts +12 -0
- package/dist/table/components/TableView.js +21 -0
- package/dist/table/defaultRowActions.d.ts +21 -0
- package/dist/table/defaultRowActions.js +37 -0
- package/dist/table/hooks/useColumnVisibility.d.ts +13 -0
- package/dist/table/hooks/useColumnVisibility.js +59 -0
- package/dist/table/hooks/useEditableRows.d.ts +22 -0
- package/dist/table/hooks/useEditableRows.js +63 -0
- package/dist/table/hooks/useTableActions.d.ts +54 -0
- package/dist/table/hooks/useTableActions.js +313 -0
- package/dist/table/hooks/useTableData.d.ts +28 -0
- package/dist/table/hooks/useTableData.js +63 -0
- package/dist/table/hooks/useTableLayout.d.ts +12 -0
- package/dist/table/hooks/useTableLayout.js +31 -0
- package/dist/table/hooks/useTableQuery.d.ts +29 -0
- package/dist/table/hooks/useTableQuery.js +135 -0
- package/dist/types/index.d.ts +224 -0
- package/dist/types/index.js +6 -0
- package/dist/utils/classNames.d.ts +7 -0
- package/dist/utils/classNames.js +9 -0
- package/dist/utils/columnMediaDimensions.d.ts +13 -0
- package/dist/utils/columnMediaDimensions.js +29 -0
- package/dist/utils/columnVisibilityStorage.d.ts +22 -0
- package/dist/utils/columnVisibilityStorage.js +56 -0
- package/dist/utils/fieldErrors.d.ts +13 -0
- package/dist/utils/fieldErrors.js +25 -0
- package/dist/utils/formatValue.d.ts +28 -0
- package/dist/utils/formatValue.js +109 -0
- package/dist/utils/layoutStorage.d.ts +23 -0
- package/dist/utils/layoutStorage.js +53 -0
- package/dist/utils/redirectHandler.d.ts +7 -0
- package/dist/utils/redirectHandler.js +25 -0
- package/dist/utils/tableFormatters.d.ts +14 -0
- package/dist/utils/tableFormatters.js +93 -0
- package/dist/utils/widgetVisibilityStorage.d.ts +11 -0
- package/dist/utils/widgetVisibilityStorage.js +39 -0
- package/package.json +101 -0
- package/src/FieldRenderer.test.tsx +44 -0
- package/src/FieldRenderer.tsx +104 -0
- package/src/FormRenderer.containers.test.tsx +121 -0
- package/src/FormRenderer.test.tsx +174 -0
- package/src/FormRenderer.tsx +140 -0
- package/src/TableRenderer.tsx +2 -0
- package/src/api/actionsApi.ts +76 -0
- package/src/api/authenticatedFetch.ts +40 -0
- package/src/api/exportApi.ts +66 -0
- package/src/api/http.test.ts +58 -0
- package/src/api/http.ts +68 -0
- package/src/api/resourceApi.ts +88 -0
- package/src/api/tableApi.test.ts +108 -0
- package/src/api/tableApi.ts +107 -0
- package/src/api/urls.ts +50 -0
- package/src/app.test.tsx +67 -0
- package/src/app.tsx +181 -0
- package/src/auth/AuthContext.tsx +188 -0
- package/src/auth/LoginPage.tsx +380 -0
- package/src/auth/ProtectedRoute.tsx +39 -0
- package/src/auth/authApiClient.ts +109 -0
- package/src/auth/authFlow.test.tsx +168 -0
- package/src/auth/types.ts +104 -0
- package/src/components/ActionFormModal.tsx +45 -0
- package/src/components/AdminPanel.tsx +368 -0
- package/src/components/Checkbox.tsx +59 -0
- package/src/components/CheckboxField.tsx +88 -0
- package/src/components/ColorPickerField.tsx +93 -0
- package/src/components/DateTimePickerField.tsx +112 -0
- package/src/components/FileUploadField.tsx +841 -0
- package/src/components/GlobalSearch.tsx +436 -0
- package/src/components/GroupField.tsx +85 -0
- package/src/components/HiddenField.tsx +14 -0
- package/src/components/ModalBreadcrumb.tsx +74 -0
- package/src/components/ModalDrawer.tsx +137 -0
- package/src/components/RadioField.tsx +80 -0
- package/src/components/RepeaterField.tsx +546 -0
- package/src/components/ResourceModalRenderer.tsx +144 -0
- package/src/components/RichEditorField.tsx +942 -0
- package/src/components/SectionField.tsx +242 -0
- package/src/components/SelectField.tsx +843 -0
- package/src/components/TabsField.test.tsx +151 -0
- package/src/components/TabsField.tsx +386 -0
- package/src/components/TagsInputField.tsx +411 -0
- package/src/components/TextInputField.tsx +91 -0
- package/src/components/TextareaField.tsx +110 -0
- package/src/components/ToggleField.tsx +126 -0
- package/src/components/ViewModal.tsx +353 -0
- package/src/components/blocks/BlockRenderer.tsx +56 -0
- package/src/components/blocks/FormBlockRenderer.tsx +160 -0
- package/src/components/blocks/TableBlockRenderer.tsx +33 -0
- package/src/components/blocks/TabsBlockRenderer.tsx +49 -0
- package/src/components/blocks/WidgetBlockRenderer.tsx +19 -0
- package/src/components/columns/CheckboxColumnComponent.tsx +38 -0
- package/src/components/columns/ColorColumnComponent.tsx +23 -0
- package/src/components/columns/CustomColumn.test.tsx +55 -0
- package/src/components/columns/DeeplinkWrapper.tsx +103 -0
- package/src/components/columns/IconColumnComponent.tsx +55 -0
- package/src/components/columns/ImageColumnComponent.tsx +220 -0
- package/src/components/columns/MediaColumnComponent.tsx +294 -0
- package/src/components/columns/SelectColumnComponent.tsx +49 -0
- package/src/components/columns/TagsColumnComponent.tsx +46 -0
- package/src/components/columns/TextColumnComponent.tsx +191 -0
- package/src/components/columns/TextInputColumnComponent.tsx +35 -0
- package/src/components/columns/ToggleColumnComponent.tsx +56 -0
- package/src/components/columns/VideoColumnComponent.tsx +236 -0
- package/src/components/columns/ViewColumnComponent.tsx +9 -0
- package/src/components/errors/ErrorBoundary.tsx +58 -0
- package/src/components/filters/CustomFilterComponent.tsx +130 -0
- package/src/components/filters/DateFilterComponent.tsx +272 -0
- package/src/components/filters/QueryBuilderFilterComponent.tsx +502 -0
- package/src/components/layout/Header.tsx +212 -0
- package/src/components/layout/PanelBrandMark.tsx +61 -0
- package/src/components/layout/Sidebar.tsx +283 -0
- package/src/components/modals/RelationCreateModal.tsx +107 -0
- package/src/components/modals/ResourceFormModal.test.tsx +119 -0
- package/src/components/modals/ResourceFormModal.tsx +128 -0
- package/src/components/modals/useResourceForm.ts +207 -0
- package/src/components/modals/view/RecordActions.tsx +69 -0
- package/src/components/modals/view/RecordDetails.tsx +60 -0
- package/src/components/modals/view/RelationPanel.tsx +76 -0
- package/src/components/modals/view/RelationTabs.tsx +145 -0
- package/src/components/modals/view/useRecordView.ts +134 -0
- package/src/components/pages/PageRenderer.tsx +173 -0
- package/src/components/table/ColumnTogglePopup.tsx +85 -0
- package/src/components/table/GridCard.tsx +155 -0
- package/src/components/table/GridView.tsx +138 -0
- package/src/components/table/LayoutToggle.tsx +24 -0
- package/src/components/table/TableActionsDropdown.tsx +114 -0
- package/src/components/table/TableBulkActions.tsx +65 -0
- package/src/components/table/TableHeader.tsx +96 -0
- package/src/components/table/TablePagination.tsx +169 -0
- package/src/components/table/TableRow.tsx +155 -0
- package/src/components/table/TableSearchBar.tsx +66 -0
- package/src/components/table/TableTabs.tsx +49 -0
- package/src/components/ui/Badge.tsx +30 -0
- package/src/components/ui/Button.test.tsx +78 -0
- package/src/components/ui/Button.tsx +102 -0
- package/src/components/ui/Card.tsx +23 -0
- package/src/components/ui/ConfirmDialog.tsx +112 -0
- package/src/components/ui/EmptyState.tsx +24 -0
- package/src/components/ui/ErrorAlert.tsx +37 -0
- package/src/components/ui/Input.tsx +48 -0
- package/src/components/ui/Label.tsx +15 -0
- package/src/components/ui/PillButton.tsx +72 -0
- package/src/components/ui/Select.tsx +33 -0
- package/src/components/ui/Spinner.tsx +39 -0
- package/src/components/ui/Toast.tsx +105 -0
- package/src/components/ui/index.ts +24 -0
- package/src/components/utils/HintDisplay.tsx +26 -0
- package/src/components/utils/Icon.tsx +36 -0
- package/src/components/utils/MediaPreviewModal.tsx +114 -0
- package/src/components/utils/ViewFieldWrapper.tsx +23 -0
- package/src/components/utils/layoutHelpers.ts +267 -0
- package/src/components/widgets/ChartWidget.tsx +247 -0
- package/src/components/widgets/StatsWidget.tsx +72 -0
- package/src/components/widgets/WidgetRenderer.tsx +108 -0
- package/src/components/widgets/WidgetShell.tsx +37 -0
- package/src/contexts/AuthChallengeRegistryContext.tsx +29 -0
- package/src/contexts/BlockRegistryContext.tsx +28 -0
- package/src/contexts/ColumnRegistryContext.tsx +38 -0
- package/src/contexts/FieldRegistryContext.tsx +56 -0
- package/src/contexts/PanelMetadataContext.tsx +60 -0
- package/src/contexts/PanelProviders.tsx +85 -0
- package/src/contexts/ResourceModalContext.tsx +137 -0
- package/src/contexts/SlotRegistryContext.tsx +35 -0
- package/src/contexts/TableRefreshContext.tsx +44 -0
- package/src/contexts/WidgetRegistryContext.tsx +34 -0
- package/src/contexts/createRegistryContext.tsx +29 -0
- package/src/hooks/useAfterStateUpdated.ts +70 -0
- package/src/hooks/useValidation.test.ts +59 -0
- package/src/hooks/useValidation.ts +95 -0
- package/src/i18n/I18nProvider.tsx +128 -0
- package/src/i18n/LocaleSwitcher.tsx +50 -0
- package/src/i18n/activeLocale.ts +39 -0
- package/src/i18n/buildClientI18n.ts +101 -0
- package/src/i18n/i18n.test.tsx +140 -0
- package/src/i18n/index.ts +12 -0
- package/src/i18n/locales/core/en.ts +274 -0
- package/src/i18n/locales/core/index.ts +5 -0
- package/src/i18n/locales/core/sq.ts +275 -0
- package/src/i18n/useFormatter.ts +42 -0
- package/src/i18n/useLocale.ts +16 -0
- package/src/i18n/useTranslation.ts +17 -0
- package/src/index.ts +244 -0
- package/src/pages/ResourceListPage.tsx +205 -0
- package/src/plugin.ts +110 -0
- package/src/runtime/conditions.test.ts +99 -0
- package/src/runtime/conditions.ts +148 -0
- package/src/runtime/formTraversal.ts +41 -0
- package/src/runtime/serializedFunctions.test.ts +59 -0
- package/src/runtime/serializedFunctions.ts +284 -0
- package/src/slots/Slot.test.tsx +89 -0
- package/src/slots/Slot.tsx +47 -0
- package/src/slots/SlotCluster.test.tsx +95 -0
- package/src/slots/SlotCluster.tsx +107 -0
- package/src/slots/index.ts +15 -0
- package/src/slots/mergeSlots.test.ts +71 -0
- package/src/slots/mergeSlots.ts +40 -0
- package/src/slots/slotNames.test.ts +21 -0
- package/src/slots/types.ts +119 -0
- package/src/styles.css +437 -0
- package/src/table/TableContext.tsx +41 -0
- package/src/table/TableRenderer.test.tsx +197 -0
- package/src/table/TableRenderer.tsx +390 -0
- package/src/table/components/FiltersPanel.tsx +193 -0
- package/src/table/components/TableToolbar.tsx +153 -0
- package/src/table/components/TableToolbarButton.tsx +14 -0
- package/src/table/components/TableView.tsx +106 -0
- package/src/table/defaultRowActions.ts +43 -0
- package/src/table/hooks/useColumnVisibility.test.ts +51 -0
- package/src/table/hooks/useColumnVisibility.ts +71 -0
- package/src/table/hooks/useEditableRows.test.ts +69 -0
- package/src/table/hooks/useEditableRows.ts +89 -0
- package/src/table/hooks/useTableActions.ts +393 -0
- package/src/table/hooks/useTableData.ts +89 -0
- package/src/table/hooks/useTableLayout.ts +45 -0
- package/src/table/hooks/useTableQuery.test.ts +116 -0
- package/src/table/hooks/useTableQuery.ts +172 -0
- package/src/test/mockFetch.ts +67 -0
- package/src/test/setup.ts +25 -0
- package/src/types/index.ts +228 -0
- package/src/utils/classNames.ts +10 -0
- package/src/utils/columnMediaDimensions.ts +45 -0
- package/src/utils/columnVisibilityStorage.ts +55 -0
- package/src/utils/fieldErrors.test.ts +35 -0
- package/src/utils/fieldErrors.ts +27 -0
- package/src/utils/formatValue.test.tsx +65 -0
- package/src/utils/formatValue.tsx +117 -0
- package/src/utils/layoutStorage.ts +52 -0
- package/src/utils/redirectHandler.ts +29 -0
- package/src/utils/tableFormatters.test.ts +54 -0
- package/src/utils/tableFormatters.ts +104 -0
- package/src/utils/widgetVisibilityStorage.ts +38 -0
- package/tailwind.config.js +9 -0
- package/vite.config.ts +17 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* All list-query state for a table: search, sort, filters, query builders,
|
|
4
|
+
* tabs, and pagination — plus the handlers that keep them consistent
|
|
5
|
+
* (changing any criterion resets to page 1; manual filtering clears the tab).
|
|
6
|
+
*/
|
|
7
|
+
export function useTableQuery(schema) {
|
|
8
|
+
// Filter defaults come from the schema
|
|
9
|
+
const initialFilters = useMemo(() => {
|
|
10
|
+
const defaults = {};
|
|
11
|
+
schema.filters?.forEach(filter => {
|
|
12
|
+
if (filter.default !== undefined && filter.type !== 'queryBuilder') {
|
|
13
|
+
defaults[filter.name] = filter.default;
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
return defaults;
|
|
17
|
+
}, [schema.filters]);
|
|
18
|
+
const initialQueryBuilders = useMemo(() => {
|
|
19
|
+
const defaults = {};
|
|
20
|
+
schema.filters?.forEach(filter => {
|
|
21
|
+
if (filter.type === 'queryBuilder' && Array.isArray(filter.default)) {
|
|
22
|
+
defaults[filter.name] = filter.default;
|
|
23
|
+
}
|
|
24
|
+
});
|
|
25
|
+
return defaults;
|
|
26
|
+
}, [schema.filters]);
|
|
27
|
+
const [searchQuery, setSearchQuery] = useState('');
|
|
28
|
+
const [sortColumn, setSortColumn] = useState(schema.defaultSort?.column);
|
|
29
|
+
const [sortDirection, setSortDirection] = useState(schema.defaultSort?.direction || 'asc');
|
|
30
|
+
const [filters, setFilters] = useState(initialFilters);
|
|
31
|
+
const [queryBuilders, setQueryBuilders] = useState(initialQueryBuilders);
|
|
32
|
+
const [activeTab, setActiveTab] = useState(() => {
|
|
33
|
+
const tabs = schema.tabs;
|
|
34
|
+
return tabs?.find(tab => tab.default === true)?.key ?? null;
|
|
35
|
+
});
|
|
36
|
+
const [currentPage, setCurrentPage] = useState(1);
|
|
37
|
+
const [perPage, setPerPage] = useState(schema.recordsPerPage || 10);
|
|
38
|
+
// Reset filters to defaults when the schema changes
|
|
39
|
+
useEffect(() => {
|
|
40
|
+
setFilters(initialFilters);
|
|
41
|
+
setQueryBuilders(initialQueryBuilders);
|
|
42
|
+
}, [initialFilters, initialQueryBuilders]);
|
|
43
|
+
const handleSearch = (query) => {
|
|
44
|
+
setSearchQuery(query);
|
|
45
|
+
setCurrentPage(1);
|
|
46
|
+
};
|
|
47
|
+
const handleSort = (column) => {
|
|
48
|
+
setSortDirection(sortColumn === column && sortDirection === 'asc' ? 'desc' : 'asc');
|
|
49
|
+
setSortColumn(column);
|
|
50
|
+
setCurrentPage(1);
|
|
51
|
+
};
|
|
52
|
+
const handleFilterChange = (name, value, isQueryBuilder = false) => {
|
|
53
|
+
// Manual filtering clears the active tab
|
|
54
|
+
setActiveTab(null);
|
|
55
|
+
if (isQueryBuilder) {
|
|
56
|
+
setQueryBuilders(prev => {
|
|
57
|
+
const next = { ...prev };
|
|
58
|
+
if (value === undefined || (Array.isArray(value) && value.length === 0)) {
|
|
59
|
+
delete next[name];
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
next[name] = value;
|
|
63
|
+
}
|
|
64
|
+
return next;
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
setFilters(prev => {
|
|
69
|
+
const next = { ...prev };
|
|
70
|
+
if (value === '' || value === undefined) {
|
|
71
|
+
delete next[name];
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
next[name] = value;
|
|
75
|
+
}
|
|
76
|
+
return next;
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
setCurrentPage(1);
|
|
80
|
+
};
|
|
81
|
+
const handleTabClick = (tabKey) => {
|
|
82
|
+
setActiveTab(tabKey);
|
|
83
|
+
setCurrentPage(1);
|
|
84
|
+
};
|
|
85
|
+
const handleClearFilters = () => {
|
|
86
|
+
setFilters(initialFilters);
|
|
87
|
+
setQueryBuilders(initialQueryBuilders);
|
|
88
|
+
setCurrentPage(1);
|
|
89
|
+
};
|
|
90
|
+
const handlePageChange = (page) => {
|
|
91
|
+
setCurrentPage(page);
|
|
92
|
+
};
|
|
93
|
+
const handlePageSizeChange = (size) => {
|
|
94
|
+
setPerPage(size);
|
|
95
|
+
setCurrentPage(1);
|
|
96
|
+
};
|
|
97
|
+
const queryParams = useMemo(() => {
|
|
98
|
+
// Merge the active tab's query-builder rules into the request
|
|
99
|
+
const finalQueryBuilders = { ...queryBuilders };
|
|
100
|
+
const tabs = schema.tabs;
|
|
101
|
+
if (activeTab && tabs) {
|
|
102
|
+
const selectedTab = tabs.find(tab => tab.key === activeTab);
|
|
103
|
+
if (selectedTab?.queryBuilder && selectedTab.queryBuilder.length > 0) {
|
|
104
|
+
finalQueryBuilders.__activeTab = selectedTab.queryBuilder;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
page: currentPage,
|
|
109
|
+
perPage,
|
|
110
|
+
search: searchQuery || undefined,
|
|
111
|
+
sort: sortColumn,
|
|
112
|
+
sortDirection,
|
|
113
|
+
filters,
|
|
114
|
+
queryBuilders: Object.keys(finalQueryBuilders).length > 0 ? finalQueryBuilders : undefined,
|
|
115
|
+
};
|
|
116
|
+
}, [queryBuilders, schema.tabs, activeTab, currentPage, perPage, searchQuery, sortColumn, sortDirection, filters]);
|
|
117
|
+
return {
|
|
118
|
+
searchQuery,
|
|
119
|
+
sortColumn,
|
|
120
|
+
sortDirection,
|
|
121
|
+
filters,
|
|
122
|
+
queryBuilders,
|
|
123
|
+
activeTab,
|
|
124
|
+
currentPage,
|
|
125
|
+
perPage,
|
|
126
|
+
handleSearch,
|
|
127
|
+
handleSort,
|
|
128
|
+
handleFilterChange,
|
|
129
|
+
handleTabClick,
|
|
130
|
+
handleClearFilters,
|
|
131
|
+
handlePageChange,
|
|
132
|
+
handlePageSizeChange,
|
|
133
|
+
queryParams,
|
|
134
|
+
};
|
|
135
|
+
}
|
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { SerializedForm, ValidationRules as KratosJsValidationRules } from '@maxal_studio/kratosjs';
|
|
2
|
+
import { ColumnRegistry } from '../contexts/ColumnRegistryContext';
|
|
3
|
+
import { WidgetComponent } from '../contexts/WidgetRegistryContext';
|
|
4
|
+
import type { CustomBlockComponent } from '../contexts/BlockRegistryContext';
|
|
5
|
+
import type { AuthChallengeRegistry } from '../contexts/AuthChallengeRegistryContext';
|
|
6
|
+
import type { ClientI18nConfig } from '../i18n/buildClientI18n';
|
|
7
|
+
import type { ResolvedSlots } from '../slots/types';
|
|
8
|
+
/**
|
|
9
|
+
* Props passed to all field components
|
|
10
|
+
*/
|
|
11
|
+
export interface FieldProps {
|
|
12
|
+
type: string;
|
|
13
|
+
name: string;
|
|
14
|
+
label?: string;
|
|
15
|
+
statePath?: string;
|
|
16
|
+
default?: any;
|
|
17
|
+
hidden?: boolean;
|
|
18
|
+
disabled?: boolean;
|
|
19
|
+
mode?: 'edit' | 'view';
|
|
20
|
+
value?: any;
|
|
21
|
+
extraAttributes?: Record<string, any>;
|
|
22
|
+
validation?: KratosJsValidationRules;
|
|
23
|
+
helperText?: string;
|
|
24
|
+
hint?: string;
|
|
25
|
+
hintIcon?: string;
|
|
26
|
+
hintColor?: string;
|
|
27
|
+
autofocus?: boolean;
|
|
28
|
+
placeholder?: string;
|
|
29
|
+
readOnly?: boolean;
|
|
30
|
+
/** When true, view mode displays the value as HTML (TextInput, Textarea, TagsInput) */
|
|
31
|
+
renderHtml?: boolean;
|
|
32
|
+
inputType?: string;
|
|
33
|
+
minLength?: number;
|
|
34
|
+
maxLength?: number;
|
|
35
|
+
min?: number;
|
|
36
|
+
max?: number;
|
|
37
|
+
step?: number;
|
|
38
|
+
mask?: string;
|
|
39
|
+
prefix?: string;
|
|
40
|
+
suffix?: string;
|
|
41
|
+
options?: Record<string | number, string>;
|
|
42
|
+
multiple?: boolean;
|
|
43
|
+
isMultiple?: boolean;
|
|
44
|
+
searchable?: boolean;
|
|
45
|
+
creatable?: boolean;
|
|
46
|
+
relationship?: {
|
|
47
|
+
name: string;
|
|
48
|
+
titleAttribute: string;
|
|
49
|
+
resource?: string;
|
|
50
|
+
};
|
|
51
|
+
createOptionForm?: any[];
|
|
52
|
+
createOptionModalHeading?: string;
|
|
53
|
+
optionLabelFormatter?: string;
|
|
54
|
+
tags?: string[];
|
|
55
|
+
separator?: string;
|
|
56
|
+
suggestions?: string[];
|
|
57
|
+
/** When true, view mode shows tags in a popup (e.g. "N tags" click to open) */
|
|
58
|
+
showInPopup?: boolean;
|
|
59
|
+
selectablePlaceholder?: boolean;
|
|
60
|
+
rows?: number;
|
|
61
|
+
cols?: number;
|
|
62
|
+
format?: string;
|
|
63
|
+
displayFormat?: string;
|
|
64
|
+
minDate?: string;
|
|
65
|
+
maxDate?: string;
|
|
66
|
+
enableTime?: boolean;
|
|
67
|
+
onColor?: string;
|
|
68
|
+
offColor?: string;
|
|
69
|
+
onIcon?: string;
|
|
70
|
+
offIcon?: string;
|
|
71
|
+
schema?: FieldProps[];
|
|
72
|
+
defaultItems?: number;
|
|
73
|
+
minItems?: number;
|
|
74
|
+
maxItems?: number;
|
|
75
|
+
addable?: boolean;
|
|
76
|
+
deletable?: boolean;
|
|
77
|
+
reorderable?: boolean;
|
|
78
|
+
itemLabel?: string;
|
|
79
|
+
acceptedFileTypes?: string[];
|
|
80
|
+
maxSize?: number;
|
|
81
|
+
minSize?: number;
|
|
82
|
+
maxFiles?: number;
|
|
83
|
+
disk?: string;
|
|
84
|
+
directory?: string;
|
|
85
|
+
visibility?: 'public' | 'private';
|
|
86
|
+
toolbarButtons?: string[];
|
|
87
|
+
fileAttachments?: boolean;
|
|
88
|
+
embeds?: boolean;
|
|
89
|
+
htmlSource?: boolean;
|
|
90
|
+
extensions?: string[];
|
|
91
|
+
heading?: string;
|
|
92
|
+
icon?: string;
|
|
93
|
+
collapsible?: boolean;
|
|
94
|
+
collapsed?: boolean;
|
|
95
|
+
compact?: boolean;
|
|
96
|
+
aside?: boolean;
|
|
97
|
+
columns?: number | Record<string, number>;
|
|
98
|
+
columnSpan?: number | string | Record<string, number | string>;
|
|
99
|
+
columnStart?: number | Record<string, number>;
|
|
100
|
+
required?: boolean;
|
|
101
|
+
/** Operation for conditional visibility (e.g. hidden(context => context.operation === 'view')) */
|
|
102
|
+
operation?: 'create' | 'edit' | 'view';
|
|
103
|
+
[key: string]: any;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Field component type
|
|
107
|
+
*/
|
|
108
|
+
export type FieldComponent = React.ComponentType<FieldProps>;
|
|
109
|
+
/**
|
|
110
|
+
* Field registry mapping field types to components
|
|
111
|
+
*/
|
|
112
|
+
export type FieldRegistry = Record<string, FieldComponent>;
|
|
113
|
+
/**
|
|
114
|
+
* Props for FormRenderer component
|
|
115
|
+
*/
|
|
116
|
+
export interface FormRendererProps {
|
|
117
|
+
schema: SerializedForm;
|
|
118
|
+
onSubmit: (data: any) => void | Promise<void>;
|
|
119
|
+
defaultValues?: Record<string, any>;
|
|
120
|
+
className?: string;
|
|
121
|
+
/** Base URL for API requests (e.g., 'http://localhost:3001/kratosjs/api') */
|
|
122
|
+
apiBaseUrl?: string;
|
|
123
|
+
/** Resource slug for media endpoints (e.g., 'users') */
|
|
124
|
+
resource?: string;
|
|
125
|
+
/** Operation type for conditional field visibility (e.g., 'create' | 'edit' | 'view') */
|
|
126
|
+
operation?: 'create' | 'edit' | 'view';
|
|
127
|
+
/** Children to render inside FormProvider (for watching form values) */
|
|
128
|
+
children?: React.ReactNode;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Props for FieldRenderer component
|
|
132
|
+
*/
|
|
133
|
+
export interface FieldRendererProps {
|
|
134
|
+
field: FieldProps;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Validation rules from React Hook Form (converted format)
|
|
138
|
+
*/
|
|
139
|
+
export interface RHFValidationRules {
|
|
140
|
+
required?: string | {
|
|
141
|
+
value: boolean;
|
|
142
|
+
message: string;
|
|
143
|
+
};
|
|
144
|
+
pattern?: {
|
|
145
|
+
value: RegExp;
|
|
146
|
+
message: string;
|
|
147
|
+
};
|
|
148
|
+
minLength?: {
|
|
149
|
+
value: number;
|
|
150
|
+
message: string;
|
|
151
|
+
};
|
|
152
|
+
maxLength?: {
|
|
153
|
+
value: number;
|
|
154
|
+
message: string;
|
|
155
|
+
};
|
|
156
|
+
min?: {
|
|
157
|
+
value: number;
|
|
158
|
+
message: string;
|
|
159
|
+
};
|
|
160
|
+
max?: {
|
|
161
|
+
value: number;
|
|
162
|
+
message: string;
|
|
163
|
+
};
|
|
164
|
+
validate?: Record<string, (value: any, formValues?: any) => boolean | string>;
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Redirect response from API
|
|
168
|
+
*/
|
|
169
|
+
export interface RedirectResponse {
|
|
170
|
+
redirect: string;
|
|
171
|
+
message?: string;
|
|
172
|
+
[key: string]: any;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Type guard to check if response is a redirect response
|
|
176
|
+
*/
|
|
177
|
+
export declare function isRedirectResponse(data: any): data is RedirectResponse;
|
|
178
|
+
/**
|
|
179
|
+
* Relation metadata served by GET /:slug/relations, consumed by the view modal
|
|
180
|
+
*/
|
|
181
|
+
export interface SerializedRelation {
|
|
182
|
+
name: string;
|
|
183
|
+
type: 'hasMany';
|
|
184
|
+
canCreate?: boolean;
|
|
185
|
+
canEdit?: boolean;
|
|
186
|
+
canDelete?: boolean;
|
|
187
|
+
canView?: boolean;
|
|
188
|
+
resourceSlug: string;
|
|
189
|
+
/** Full API URL for the related resource */
|
|
190
|
+
resourceApiUrl?: string;
|
|
191
|
+
label: string;
|
|
192
|
+
pluralLabel: string;
|
|
193
|
+
icon?: string;
|
|
194
|
+
localKey: string;
|
|
195
|
+
foreignKey: string;
|
|
196
|
+
relatedKey: string;
|
|
197
|
+
groupKey?: string;
|
|
198
|
+
groupLabel?: string;
|
|
199
|
+
groupIcon?: string;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Widget registry mapping widget types to components
|
|
203
|
+
*/
|
|
204
|
+
export type WidgetRegistry = Record<string, WidgetComponent>;
|
|
205
|
+
/**
|
|
206
|
+
* Block registry mapping custom block types to components
|
|
207
|
+
*/
|
|
208
|
+
export type BlockRegistry = Record<string, CustomBlockComponent>;
|
|
209
|
+
/**
|
|
210
|
+
* Props for AdminPanel component
|
|
211
|
+
*/
|
|
212
|
+
export interface AdminPanelProps {
|
|
213
|
+
apiBaseUrl: string;
|
|
214
|
+
panelId?: string;
|
|
215
|
+
customFields?: FieldRegistry;
|
|
216
|
+
customColumns?: ColumnRegistry;
|
|
217
|
+
customWidgets?: WidgetRegistry;
|
|
218
|
+
customBlocks?: BlockRegistry;
|
|
219
|
+
customAuthChallenges?: AuthChallengeRegistry;
|
|
220
|
+
/** Merged, resolved slot contributions keyed by slot name. */
|
|
221
|
+
customSlots?: ResolvedSlots;
|
|
222
|
+
/** i18n config for UI chrome + app frontend strings (server-injected). */
|
|
223
|
+
i18nConfig?: ClientI18nConfig;
|
|
224
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { CSSProperties } from 'react';
|
|
2
|
+
interface ColumnMediaSizeOptions {
|
|
3
|
+
width?: number | string;
|
|
4
|
+
height?: number | string;
|
|
5
|
+
ratio?: string;
|
|
6
|
+
circular?: boolean;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Dimensions for image/media/video column thumbnails.
|
|
10
|
+
* Circular columns always render as a true square (1:1) so rounded-full clips a circle.
|
|
11
|
+
*/
|
|
12
|
+
export declare function getColumnMediaDimensions(column: ColumnMediaSizeOptions, defaultSize?: number | string): CSSProperties;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dimensions for image/media/video column thumbnails.
|
|
3
|
+
* Circular columns always render as a true square (1:1) so rounded-full clips a circle.
|
|
4
|
+
*/
|
|
5
|
+
export function getColumnMediaDimensions(column, defaultSize = 40) {
|
|
6
|
+
if (column.circular) {
|
|
7
|
+
const raw = column.width ?? column.height ?? defaultSize;
|
|
8
|
+
const size = typeof raw === 'number' ? `${raw}px` : raw;
|
|
9
|
+
return {
|
|
10
|
+
width: size,
|
|
11
|
+
height: size,
|
|
12
|
+
minWidth: size,
|
|
13
|
+
minHeight: size,
|
|
14
|
+
flexShrink: 0,
|
|
15
|
+
aspectRatio: '1 / 1',
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
const ratio = column.ratio || '16/9';
|
|
19
|
+
if (column.width) {
|
|
20
|
+
const w = typeof column.width === 'number' ? `${column.width}px` : column.width;
|
|
21
|
+
return { width: w, minWidth: w, flexShrink: 0, aspectRatio: ratio };
|
|
22
|
+
}
|
|
23
|
+
if (column.height) {
|
|
24
|
+
const h = typeof column.height === 'number' ? `${column.height}px` : column.height;
|
|
25
|
+
return { height: h, minHeight: h, flexShrink: 0, aspectRatio: ratio };
|
|
26
|
+
}
|
|
27
|
+
const w = typeof defaultSize === 'number' ? `${defaultSize}px` : defaultSize;
|
|
28
|
+
return { width: w, minWidth: w, flexShrink: 0, aspectRatio: ratio };
|
|
29
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column visibility storage utilities for managing column visibility preferences in localStorage
|
|
3
|
+
*/
|
|
4
|
+
export declare const columnVisibilityStorage: {
|
|
5
|
+
/**
|
|
6
|
+
* Get hidden columns for a resource
|
|
7
|
+
* @param resourceKey Unique identifier for the resource (e.g., 'users', 'users_posts')
|
|
8
|
+
* @returns Array of hidden column names, or null if not found (never been set)
|
|
9
|
+
*/
|
|
10
|
+
getHiddenColumns(resourceKey: string): string[] | null;
|
|
11
|
+
/**
|
|
12
|
+
* Set hidden columns for a resource
|
|
13
|
+
* @param resourceKey Unique identifier for the resource
|
|
14
|
+
* @param hiddenColumns Array of column names that should be hidden
|
|
15
|
+
*/
|
|
16
|
+
setHiddenColumns(resourceKey: string, hiddenColumns: string[]): void;
|
|
17
|
+
/**
|
|
18
|
+
* Clear stored column visibility preferences for a resource
|
|
19
|
+
* @param resourceKey Unique identifier for the resource
|
|
20
|
+
*/
|
|
21
|
+
clearHiddenColumns(resourceKey: string): void;
|
|
22
|
+
};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Column visibility storage utilities for managing column visibility preferences in localStorage
|
|
3
|
+
*/
|
|
4
|
+
export const columnVisibilityStorage = {
|
|
5
|
+
/**
|
|
6
|
+
* Get hidden columns for a resource
|
|
7
|
+
* @param resourceKey Unique identifier for the resource (e.g., 'users', 'users_posts')
|
|
8
|
+
* @returns Array of hidden column names, or null if not found (never been set)
|
|
9
|
+
*/
|
|
10
|
+
getHiddenColumns(resourceKey) {
|
|
11
|
+
try {
|
|
12
|
+
const key = `kratosjs_column_visibility_${resourceKey}`;
|
|
13
|
+
const stored = localStorage.getItem(key);
|
|
14
|
+
if (stored === null) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const parsed = JSON.parse(stored);
|
|
18
|
+
if (Array.isArray(parsed)) {
|
|
19
|
+
return parsed;
|
|
20
|
+
}
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
catch (error) {
|
|
24
|
+
console.warn('Failed to parse column visibility from localStorage:', error);
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
/**
|
|
29
|
+
* Set hidden columns for a resource
|
|
30
|
+
* @param resourceKey Unique identifier for the resource
|
|
31
|
+
* @param hiddenColumns Array of column names that should be hidden
|
|
32
|
+
*/
|
|
33
|
+
setHiddenColumns(resourceKey, hiddenColumns) {
|
|
34
|
+
try {
|
|
35
|
+
const key = `kratosjs_column_visibility_${resourceKey}`;
|
|
36
|
+
localStorage.setItem(key, JSON.stringify(hiddenColumns));
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
// Handle quota exceeded or other localStorage errors
|
|
40
|
+
if (error instanceof Error && error.name === 'QuotaExceededError') {
|
|
41
|
+
console.warn('localStorage quota exceeded, column visibility preferences not saved');
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.warn('Failed to save column visibility to localStorage:', error);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
/**
|
|
49
|
+
* Clear stored column visibility preferences for a resource
|
|
50
|
+
* @param resourceKey Unique identifier for the resource
|
|
51
|
+
*/
|
|
52
|
+
clearHiddenColumns(resourceKey) {
|
|
53
|
+
const key = `kratosjs_column_visibility_${resourceKey}`;
|
|
54
|
+
localStorage.removeItem(key);
|
|
55
|
+
},
|
|
56
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { FieldErrors, FieldError } from 'react-hook-form';
|
|
2
|
+
/**
|
|
3
|
+
* Resolve a React Hook Form error by its (possibly nested) field-name path.
|
|
4
|
+
*
|
|
5
|
+
* RHF stores errors for nested / array fields as nested objects — e.g. a field
|
|
6
|
+
* registered as `items.0.name` lives at `errors.items[0].name`, NOT at the flat
|
|
7
|
+
* key `errors['items.0.name']`. Field components therefore can't find the error
|
|
8
|
+
* for a Repeater row (or any dotted name) with a plain `errors[name]` lookup.
|
|
9
|
+
*
|
|
10
|
+
* This walks the dot/bracket path so both flat names (`email`) and nested ones
|
|
11
|
+
* (`items.0.name`, `items[0].name`) resolve correctly.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getFieldError(errors: FieldErrors | undefined, name: string | undefined): FieldError | undefined;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve a React Hook Form error by its (possibly nested) field-name path.
|
|
3
|
+
*
|
|
4
|
+
* RHF stores errors for nested / array fields as nested objects — e.g. a field
|
|
5
|
+
* registered as `items.0.name` lives at `errors.items[0].name`, NOT at the flat
|
|
6
|
+
* key `errors['items.0.name']`. Field components therefore can't find the error
|
|
7
|
+
* for a Repeater row (or any dotted name) with a plain `errors[name]` lookup.
|
|
8
|
+
*
|
|
9
|
+
* This walks the dot/bracket path so both flat names (`email`) and nested ones
|
|
10
|
+
* (`items.0.name`, `items[0].name`) resolve correctly.
|
|
11
|
+
*/
|
|
12
|
+
export function getFieldError(errors, name) {
|
|
13
|
+
if (!errors || !name)
|
|
14
|
+
return undefined;
|
|
15
|
+
const segments = name.split(/[.[\]]+/).filter(Boolean);
|
|
16
|
+
let current = errors;
|
|
17
|
+
for (const segment of segments) {
|
|
18
|
+
if (current == null)
|
|
19
|
+
return undefined;
|
|
20
|
+
current = current[segment];
|
|
21
|
+
}
|
|
22
|
+
// A resolved node is an error only when it carries a `type`/`message`; nested
|
|
23
|
+
// containers (e.g. the array node `errors.items`) are not field errors.
|
|
24
|
+
return current && (current.type || current.message) ? current : undefined;
|
|
25
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions for formatting field values in view mode
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Format a date value according to the specified format
|
|
7
|
+
*/
|
|
8
|
+
export declare function formatDate(value: any, format?: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* Format a number value with optional options
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatNumber(value: any, options?: {
|
|
13
|
+
decimals?: number;
|
|
14
|
+
currency?: string;
|
|
15
|
+
}): string;
|
|
16
|
+
/**
|
|
17
|
+
* Format a boolean value
|
|
18
|
+
*/
|
|
19
|
+
export declare function formatBoolean(value: any): string;
|
|
20
|
+
/**
|
|
21
|
+
* Format a select value to display option labels
|
|
22
|
+
*/
|
|
23
|
+
export declare function formatSelectLabel(value: any, options?: Record<string | number, string>, isMultiple?: boolean): string;
|
|
24
|
+
/**
|
|
25
|
+
* Format a textarea value preserving line breaks
|
|
26
|
+
* Returns an array of React elements for rendering
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatTextarea(value: any): React.ReactNode;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { getActiveLocale, translate } from '../i18n/activeLocale';
|
|
4
|
+
/**
|
|
5
|
+
* Utility functions for formatting field values in view mode
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Format a date value according to the specified format
|
|
9
|
+
*/
|
|
10
|
+
export function formatDate(value, format) {
|
|
11
|
+
if (!value)
|
|
12
|
+
return '-';
|
|
13
|
+
try {
|
|
14
|
+
const date = new Date(value);
|
|
15
|
+
if (isNaN(date.getTime()))
|
|
16
|
+
return String(value);
|
|
17
|
+
if (format) {
|
|
18
|
+
// Simple format support - can be extended
|
|
19
|
+
const year = date.getFullYear();
|
|
20
|
+
const month = String(date.getMonth() + 1).padStart(2, '0');
|
|
21
|
+
const day = String(date.getDate()).padStart(2, '0');
|
|
22
|
+
const hours = String(date.getHours()).padStart(2, '0');
|
|
23
|
+
const minutes = String(date.getMinutes()).padStart(2, '0');
|
|
24
|
+
const seconds = String(date.getSeconds()).padStart(2, '0');
|
|
25
|
+
return format
|
|
26
|
+
.replace('YYYY', String(year))
|
|
27
|
+
.replace('MM', month)
|
|
28
|
+
.replace('DD', day)
|
|
29
|
+
.replace('HH', hours)
|
|
30
|
+
.replace('mm', minutes)
|
|
31
|
+
.replace('ss', seconds);
|
|
32
|
+
}
|
|
33
|
+
return date.toLocaleString(getActiveLocale());
|
|
34
|
+
}
|
|
35
|
+
catch {
|
|
36
|
+
return String(value);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format a number value with optional options
|
|
41
|
+
*/
|
|
42
|
+
export function formatNumber(value, options) {
|
|
43
|
+
if (value === null || value === undefined)
|
|
44
|
+
return '-';
|
|
45
|
+
const num = Number(value);
|
|
46
|
+
if (isNaN(num))
|
|
47
|
+
return String(value);
|
|
48
|
+
if (options?.currency) {
|
|
49
|
+
return new Intl.NumberFormat(getActiveLocale(), {
|
|
50
|
+
style: 'currency',
|
|
51
|
+
currency: options.currency,
|
|
52
|
+
minimumFractionDigits: options.decimals ?? 2,
|
|
53
|
+
maximumFractionDigits: options.decimals ?? 2,
|
|
54
|
+
}).format(num);
|
|
55
|
+
}
|
|
56
|
+
if (options?.decimals !== undefined) {
|
|
57
|
+
return num.toFixed(options.decimals);
|
|
58
|
+
}
|
|
59
|
+
return num.toLocaleString(getActiveLocale());
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Format a boolean value
|
|
63
|
+
*/
|
|
64
|
+
export function formatBoolean(value) {
|
|
65
|
+
if (value === null || value === undefined)
|
|
66
|
+
return '-';
|
|
67
|
+
return value ? translate('core:common.yes') : translate('core:common.no');
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Format a select value to display option labels
|
|
71
|
+
*/
|
|
72
|
+
export function formatSelectLabel(value, options, isMultiple) {
|
|
73
|
+
if (!value)
|
|
74
|
+
return '-';
|
|
75
|
+
if (isMultiple && Array.isArray(value)) {
|
|
76
|
+
if (value.length === 0)
|
|
77
|
+
return '-';
|
|
78
|
+
if (!options)
|
|
79
|
+
return value.join(', ');
|
|
80
|
+
return value
|
|
81
|
+
.map(v => {
|
|
82
|
+
const key = String(v);
|
|
83
|
+
return options[key] || key;
|
|
84
|
+
})
|
|
85
|
+
.join(', ');
|
|
86
|
+
}
|
|
87
|
+
if (!options)
|
|
88
|
+
return String(value);
|
|
89
|
+
const key = String(value);
|
|
90
|
+
return options[key] || key;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Format a textarea value preserving line breaks
|
|
94
|
+
* Returns an array of React elements for rendering
|
|
95
|
+
*/
|
|
96
|
+
export function formatTextarea(value) {
|
|
97
|
+
if (value === null || value === undefined)
|
|
98
|
+
return '-';
|
|
99
|
+
// If is js object, return json string
|
|
100
|
+
let text = value;
|
|
101
|
+
if (typeof value === 'object') {
|
|
102
|
+
text = JSON.stringify(value, null, 2);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
text = String(value);
|
|
106
|
+
}
|
|
107
|
+
const lines = text.split('\n');
|
|
108
|
+
return lines.map((line, i) => (_jsxs(React.Fragment, { children: [line, i < lines.length - 1 && _jsx("br", {})] }, i)));
|
|
109
|
+
}
|