@firecms/core 3.0.0-canary.15 → 3.0.0-canary.150
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 +3 -3
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +16 -0
- package/dist/app/Scaffold.d.ts +30 -0
- package/dist/app/index.d.ts +4 -0
- package/dist/app/useApp.d.ts +16 -0
- package/dist/components/ArrayContainer.d.ts +19 -6
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/{DeleteConfirmationDialog.d.ts → ConfirmationDialog.d.ts} +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -12
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +1 -1
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +7 -5
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +1 -0
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +3 -1
- package/dist/components/EntityCollectionTable/internal/CollectionTableToolbar.d.ts +1 -4
- package/dist/components/EntityCollectionTable/internal/EntityTableCell.d.ts +2 -2
- package/dist/components/EntityCollectionTable/internal/popup_field/PopupFormField.d.ts +7 -4
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/utils.d.ts +3 -0
- package/dist/components/EntityPreview.d.ts +7 -6
- package/dist/components/ErrorView.d.ts +1 -1
- package/dist/components/HomePage/DefaultHomePage.d.ts +1 -1
- package/dist/components/HomePage/NavigationCardBinding.d.ts +1 -1
- package/dist/components/PropertyConfigBadge.d.ts +2 -1
- package/dist/components/PropertyIdCopyTooltip.d.ts +8 -0
- package/dist/components/ReferenceWidget.d.ts +3 -1
- package/dist/components/SelectableTable/SelectableTable.d.ts +1 -1
- package/dist/components/SelectableTable/filters/ReferenceFilterField.d.ts +2 -1
- package/dist/components/VirtualTable/VirtualTableProps.d.ts +15 -12
- package/dist/components/VirtualTable/types.d.ts +3 -3
- package/dist/components/{EntityCollectionTable/internal → common}/default_entity_actions.d.ts +1 -1
- package/dist/components/common/index.d.ts +1 -0
- package/dist/components/common/table_height.d.ts +5 -0
- package/dist/components/common/types.d.ts +4 -6
- package/dist/components/common/useColumnsIds.d.ts +2 -1
- package/dist/components/common/useDataSourceEntityCollectionTableController.d.ts +4 -1
- package/dist/components/index.d.ts +4 -2
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +6 -9
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +10 -0
- package/dist/core/EntityEditView.d.ts +18 -4
- package/dist/core/FireCMS.d.ts +2 -2
- package/dist/core/NavigationRoutes.d.ts +3 -3
- package/dist/core/index.d.ts +3 -4
- package/dist/form/PropertyFieldBinding.d.ts +1 -1
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/LabelWithIcon.d.ts +1 -1
- package/dist/form/components/LabelWithIconAndTooltip.d.ts +15 -0
- package/dist/form/components/StorageItemPreview.d.ts +4 -4
- package/dist/form/components/index.d.ts +1 -1
- package/dist/form/field_bindings/ArrayCustomShapedFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ArrayOfReferencesFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/BlockFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/KeyValueFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/MarkdownEditorFieldBinding.d.ts +11 -0
- package/dist/form/field_bindings/{MultiSelectBinding.d.ts → MultiSelectFieldBinding.d.ts} +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/ReferenceFieldBinding.d.ts +2 -2
- package/dist/form/field_bindings/RepeatFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/SelectFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +3 -5
- package/dist/form/field_bindings/TextFieldBinding.d.ts +1 -1
- package/dist/form/index.d.ts +3 -5
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/delete.d.ts +4 -4
- package/dist/hooks/data/save.d.ts +4 -5
- package/dist/hooks/data/useCollectionFetch.d.ts +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +3 -3
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useAuthController.d.ts +1 -1
- package/dist/hooks/useBuildNavigationController.d.ts +3 -4
- package/dist/hooks/useFireCMSContext.d.ts +1 -1
- package/dist/hooks/useProjectLog.d.ts +8 -2
- package/dist/hooks/useResolvedNavigationFrom.d.ts +3 -3
- package/dist/hooks/useValidateAuthenticator.d.ts +5 -9
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +16536 -13058
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +20159 -587
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/preview/PropertyPreviewProps.d.ts +6 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -2
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/types/auth.d.ts +7 -11
- package/dist/types/collections.d.ts +53 -18
- package/dist/types/datasource.d.ts +51 -35
- package/dist/types/entities.d.ts +6 -1
- package/dist/types/entity_actions.d.ts +18 -4
- package/dist/types/entity_callbacks.d.ts +16 -16
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/export_import.d.ts +4 -4
- package/dist/types/fields.d.ts +63 -41
- package/dist/types/firecms.d.ts +6 -2
- package/dist/types/firecms_context.d.ts +1 -1
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +6 -5
- package/dist/types/permissions.d.ts +4 -4
- package/dist/types/plugins.d.ts +22 -12
- package/dist/types/properties.d.ts +34 -21
- package/dist/types/property_config.d.ts +0 -2
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +86 -3
- package/dist/types/user.d.ts +1 -0
- package/dist/util/builders.d.ts +2 -2
- package/dist/util/entities.d.ts +2 -2
- package/dist/util/icon_list.d.ts +5 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +6 -3
- package/dist/util/index.d.ts +1 -0
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/objects.d.ts +2 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +3 -3
- package/dist/util/resolutions.d.ts +30 -16
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +3 -3
- package/package.json +128 -119
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +24 -0
- package/src/app/Scaffold.tsx +243 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +92 -25
- package/src/components/CircularProgressCenter.tsx +2 -2
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/{DeleteConfirmationDialog.tsx → ConfirmationDialog.tsx} +1 -1
- package/src/components/DeleteEntityDialog.tsx +1 -1
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +13 -20
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +25 -24
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +12 -8
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +47 -39
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +31 -17
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +16 -8
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +36 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +82 -75
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +139 -87
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityCollectionView/utils.ts +19 -0
- package/src/components/EntityPreview.tsx +47 -41
- package/src/components/EntityView.tsx +10 -10
- package/src/components/ErrorView.tsx +3 -3
- package/src/components/HomePage/DefaultHomePage.tsx +25 -19
- package/src/components/HomePage/FavouritesView.tsx +1 -1
- package/src/components/HomePage/NavigationCard.tsx +4 -4
- package/src/components/HomePage/NavigationCardBinding.tsx +2 -2
- package/src/components/HomePage/NavigationGroup.tsx +2 -2
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/PropertyConfigBadge.tsx +9 -3
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -7
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +10 -7
- package/src/components/SelectableTable/SelectableTable.tsx +9 -9
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +22 -7
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +28 -6
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +88 -21
- package/src/components/VirtualTable/VirtualTable.tsx +77 -46
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -9
- package/src/components/VirtualTable/VirtualTableHeader.tsx +10 -10
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +5 -6
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +4 -4
- package/src/components/VirtualTable/fields/VirtualTableInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableNumberInput.tsx +2 -1
- package/src/components/VirtualTable/fields/VirtualTableSelect.tsx +14 -28
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +8 -4
- package/src/components/common/index.ts +1 -0
- package/src/components/{VirtualTable/common.tsx → common/table_height.tsx} +5 -2
- package/src/components/common/types.tsx +4 -6
- package/src/components/common/useColumnsIds.tsx +23 -2
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +25 -14
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +4 -2
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/core/DefaultAppBar.tsx +178 -0
- package/src/core/DefaultDrawer.tsx +183 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +717 -154
- package/src/core/EntitySidePanel.tsx +1 -2
- package/src/core/FireCMS.tsx +54 -53
- package/src/core/NavigationRoutes.tsx +7 -8
- package/src/core/SideDialogs.tsx +2 -1
- package/src/core/field_configs.tsx +8 -9
- package/src/core/index.tsx +3 -4
- package/src/form/PropertyFieldBinding.tsx +74 -35
- package/src/form/components/CustomIdField.tsx +4 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/LabelWithIcon.tsx +27 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +22 -12
- package/src/form/components/StorageUploadProgress.tsx +3 -4
- package/src/form/components/index.tsx +1 -1
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +29 -17
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +45 -35
- package/src/form/field_bindings/BlockFieldBinding.tsx +51 -32
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +54 -45
- package/src/form/field_bindings/MapFieldBinding.tsx +65 -48
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
- package/src/form/field_bindings/{MultiSelectBinding.tsx → MultiSelectFieldBinding.tsx} +25 -20
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +42 -31
- package/src/form/field_bindings/RepeatFieldBinding.tsx +52 -34
- package/src/form/field_bindings/SelectFieldBinding.tsx +20 -13
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +36 -46
- package/src/form/field_bindings/SwitchFieldBinding.tsx +9 -5
- package/src/form/field_bindings/TextFieldBinding.tsx +26 -23
- package/src/form/index.tsx +4 -9
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +6 -5
- package/src/hooks/data/save.ts +12 -8
- package/src/hooks/data/useCollectionFetch.tsx +2 -2
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/data/useEntityFetch.tsx +5 -5
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useAuthController.tsx +1 -1
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +11 -5
- package/src/hooks/useBuildNavigationController.tsx +92 -34
- package/src/hooks/useFireCMSContext.tsx +5 -5
- package/src/hooks/useProjectLog.tsx +32 -10
- package/src/hooks/useResolvedNavigationFrom.tsx +6 -6
- package/src/hooks/useValidateAuthenticator.tsx +21 -41
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +72 -82
- package/src/internal/useBuildSideDialogsController.tsx +1 -0
- package/src/internal/useBuildSideEntityController.tsx +102 -22
- package/src/internal/useUnsavedChangesDialog.tsx +3 -1
- package/src/preview/PropertyPreview.tsx +11 -18
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EmptyValue.tsx +1 -1
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +25 -35
- package/src/preview/components/ReferencePreview.tsx +23 -34
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +4 -3
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +4 -5
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +4 -5
- package/src/preview/property_previews/MapPropertyPreview.tsx +6 -6
- package/src/preview/property_previews/SkeletonPropertyComponent.tsx +2 -2
- package/src/preview/property_previews/StringPropertyPreview.tsx +3 -3
- package/src/preview/util.ts +2 -2
- package/src/types/auth.tsx +7 -13
- package/src/types/collections.ts +62 -20
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +60 -43
- package/src/types/entities.ts +11 -1
- package/src/types/entity_actions.tsx +20 -7
- package/src/types/entity_callbacks.ts +18 -18
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/export_import.ts +4 -4
- package/src/types/fields.tsx +69 -45
- package/src/types/firecms.tsx +7 -2
- package/src/types/firecms_context.tsx +1 -1
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +7 -7
- package/src/types/permissions.ts +5 -5
- package/src/types/plugins.tsx +24 -14
- package/src/types/properties.ts +39 -22
- package/src/types/property_config.tsx +0 -2
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/storage.ts +94 -3
- package/src/types/user.ts +2 -0
- package/src/util/builders.ts +6 -6
- package/src/util/entities.ts +6 -5
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +15 -10
- package/src/util/icon_synonyms.ts +3 -99
- package/src/util/icons.tsx +17 -7
- package/src/util/index.ts +1 -0
- package/src/util/make_properties_editable.ts +13 -5
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +45 -28
- package/src/util/permissions.ts +9 -8
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +11 -4
- package/src/util/references.ts +3 -0
- package/src/util/resolutions.ts +79 -46
- package/src/util/storage.ts +79 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +33 -7
- package/src/util/useTraceUpdate.tsx +1 -0
- package/dist/components/PropertyIdCopyTooltipContent.d.ts +0 -3
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/Scaffold.d.ts +0 -55
- package/dist/core/SideEntityView.d.ts +0 -7
- package/dist/form/EntityForm.d.ts +0 -77
- package/dist/form/components/FormikArrayContainer.d.ts +0 -18
- package/dist/form/field_bindings/MarkdownFieldBinding.d.ts +0 -9
- package/dist/internal/useBuildCustomizationController.d.ts +0 -2
- package/dist/internal/useLocaleConfig.d.ts +0 -1
- package/dist/types/appcheck.d.ts +0 -26
- package/src/components/FireCMSAppBar.tsx +0 -165
- package/src/components/PropertyIdCopyTooltipContent.tsx +0 -28
- package/src/core/Drawer.tsx +0 -191
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/EntityForm.tsx +0 -728
- package/src/form/components/FormikArrayContainer.tsx +0 -44
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +0 -695
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import React, { PropsWithChildren, useCallback } from "react";
|
|
2
|
+
import { ChevronLeftIcon, cls, defaultBorderMixin, IconButton, MenuIcon, Sheet, Tooltip } from "@firecms/ui";
|
|
3
|
+
import equal from "react-fast-compare"
|
|
4
|
+
import { useLargeLayout } from "../hooks";
|
|
5
|
+
import { ErrorBoundary } from "../components";
|
|
6
|
+
import { AppContext } from "./useApp";
|
|
7
|
+
|
|
8
|
+
export const DRAWER_WIDTH = 280;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* @group Core
|
|
12
|
+
*/
|
|
13
|
+
export interface ScaffoldProps {
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Open the drawer on hover
|
|
17
|
+
*/
|
|
18
|
+
autoOpenDrawer?: boolean;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Logo to be displayed in the top bar and drawer.
|
|
22
|
+
* Note that this has no effect if you are using a custom AppBar or Drawer.
|
|
23
|
+
*/
|
|
24
|
+
logo?: string;
|
|
25
|
+
|
|
26
|
+
className?: string;
|
|
27
|
+
|
|
28
|
+
style?: React.CSSProperties;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* This view acts as a scaffold for FireCMS.
|
|
33
|
+
*
|
|
34
|
+
* It is in charge of displaying the navigation drawer, top bar and main
|
|
35
|
+
* collection views.
|
|
36
|
+
* This component needs a parent {@link FireCMS}
|
|
37
|
+
*
|
|
38
|
+
* @param props
|
|
39
|
+
|
|
40
|
+
* @group Core
|
|
41
|
+
*/
|
|
42
|
+
export const Scaffold = React.memo<PropsWithChildren<ScaffoldProps>>(
|
|
43
|
+
function Scaffold(props: PropsWithChildren<ScaffoldProps>) {
|
|
44
|
+
|
|
45
|
+
const {
|
|
46
|
+
children,
|
|
47
|
+
autoOpenDrawer,
|
|
48
|
+
logo,
|
|
49
|
+
className,
|
|
50
|
+
style
|
|
51
|
+
} = props;
|
|
52
|
+
|
|
53
|
+
const drawerChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "Drawer");
|
|
54
|
+
if (drawerChildren.length > 1) {
|
|
55
|
+
throw Error("Only one Drawer component is allowed in Scaffold");
|
|
56
|
+
}
|
|
57
|
+
const appBarChildren = React.Children.toArray(children).filter((child: any) => child.type.componentType === "AppBar");
|
|
58
|
+
if (appBarChildren.length > 1) {
|
|
59
|
+
throw Error("Only one AppBar component is allowed in Scaffold");
|
|
60
|
+
}
|
|
61
|
+
const otherChildren = React.Children.toArray(children)
|
|
62
|
+
.filter((child: any) => child.type.componentType !== "Drawer" && child.type.componentType !== "AppBar");
|
|
63
|
+
const includeDrawer = drawerChildren.length > 0;
|
|
64
|
+
const largeLayout = useLargeLayout();
|
|
65
|
+
|
|
66
|
+
const [drawerOpen, setDrawerOpen] = React.useState(false);
|
|
67
|
+
const [onHover, setOnHover] = React.useState(false);
|
|
68
|
+
|
|
69
|
+
const setOnHoverTrue = useCallback(() => setOnHover(true), []);
|
|
70
|
+
const setOnHoverFalse = useCallback(() => setOnHover(false), []);
|
|
71
|
+
|
|
72
|
+
const handleDrawerOpen = useCallback(() => {
|
|
73
|
+
setDrawerOpen(true);
|
|
74
|
+
}, []);
|
|
75
|
+
|
|
76
|
+
const handleDrawerClose = useCallback(() => {
|
|
77
|
+
setDrawerOpen(false);
|
|
78
|
+
}, []);
|
|
79
|
+
|
|
80
|
+
const computedDrawerOpen: boolean = drawerOpen || Boolean(largeLayout && autoOpenDrawer && onHover);
|
|
81
|
+
|
|
82
|
+
const hasAppBar = Boolean(appBarChildren.length > 0);
|
|
83
|
+
return (
|
|
84
|
+
<AppContext.Provider value={{
|
|
85
|
+
logo,
|
|
86
|
+
hasDrawer: includeDrawer,
|
|
87
|
+
drawerHovered: onHover,
|
|
88
|
+
drawerOpen: computedDrawerOpen,
|
|
89
|
+
closeDrawer: handleDrawerClose,
|
|
90
|
+
openDrawer: handleDrawerOpen,
|
|
91
|
+
autoOpenDrawer
|
|
92
|
+
}}>
|
|
93
|
+
<div
|
|
94
|
+
className={cls("flex h-screen w-screen bg-surface-50 dark:bg-surface-900 text-surface-900 dark:text-white overflow-hidden", className)}
|
|
95
|
+
style={{
|
|
96
|
+
paddingTop: "env(safe-area-inset-top)",
|
|
97
|
+
paddingLeft: "env(safe-area-inset-left)",
|
|
98
|
+
paddingRight: "env(safe-area-inset-right)",
|
|
99
|
+
paddingBottom: "env(safe-area-inset-bottom)",
|
|
100
|
+
height: "100dvh",
|
|
101
|
+
...style
|
|
102
|
+
}}>
|
|
103
|
+
|
|
104
|
+
{appBarChildren}
|
|
105
|
+
|
|
106
|
+
<DrawerWrapper
|
|
107
|
+
displayed={includeDrawer}
|
|
108
|
+
onMouseEnter={setOnHoverTrue}
|
|
109
|
+
onMouseMove={setOnHoverTrue}
|
|
110
|
+
onMouseLeave={setOnHoverFalse}
|
|
111
|
+
open={computedDrawerOpen}
|
|
112
|
+
hovered={onHover}
|
|
113
|
+
setDrawerOpen={setDrawerOpen}>
|
|
114
|
+
{includeDrawer && drawerChildren}
|
|
115
|
+
</DrawerWrapper>
|
|
116
|
+
|
|
117
|
+
<main
|
|
118
|
+
className="flex flex-col flex-grow overflow-auto">
|
|
119
|
+
{hasAppBar && <DrawerHeader/>}
|
|
120
|
+
<div
|
|
121
|
+
className={cls(defaultBorderMixin, "flex-grow overflow-auto lg:m-0 lg:mx-4 lg:mb-4 lg:rounded-lg lg:border lg:border-solid m-0 mt-1", {
|
|
122
|
+
"lg:mt-4": !hasAppBar
|
|
123
|
+
})}>
|
|
124
|
+
|
|
125
|
+
<ErrorBoundary>
|
|
126
|
+
{otherChildren}
|
|
127
|
+
</ErrorBoundary>
|
|
128
|
+
|
|
129
|
+
</div>
|
|
130
|
+
</main>
|
|
131
|
+
</div>
|
|
132
|
+
</AppContext.Provider>
|
|
133
|
+
);
|
|
134
|
+
},
|
|
135
|
+
equal
|
|
136
|
+
)
|
|
137
|
+
|
|
138
|
+
const DrawerHeader = () => {
|
|
139
|
+
return (
|
|
140
|
+
<div className="flex flex-col min-h-16"></div>
|
|
141
|
+
);
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
function DrawerWrapper(props: {
|
|
145
|
+
children: React.ReactNode,
|
|
146
|
+
displayed: boolean,
|
|
147
|
+
open: boolean,
|
|
148
|
+
logo?: string,
|
|
149
|
+
hovered: boolean,
|
|
150
|
+
setDrawerOpen: (open: boolean) => void,
|
|
151
|
+
onMouseEnter: () => void,
|
|
152
|
+
onMouseMove: () => void,
|
|
153
|
+
onMouseLeave: () => void
|
|
154
|
+
}) {
|
|
155
|
+
|
|
156
|
+
const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
|
|
157
|
+
const innerDrawer = <div
|
|
158
|
+
className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
|
|
159
|
+
style={{
|
|
160
|
+
width,
|
|
161
|
+
transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
|
|
162
|
+
}}
|
|
163
|
+
>
|
|
164
|
+
|
|
165
|
+
{!props.open && props.displayed && (
|
|
166
|
+
<Tooltip title="Open menu"
|
|
167
|
+
side="right"
|
|
168
|
+
sideOffset={12}
|
|
169
|
+
asChild={true}>
|
|
170
|
+
<div
|
|
171
|
+
className="ml-2 fixed top-1 left-2 sm:top-2 sm:left-2 !bg-surface-50 dark:!bg-surface-900 rounded-full w-fit z-20">
|
|
172
|
+
<IconButton
|
|
173
|
+
color="inherit"
|
|
174
|
+
aria-label="Open menu"
|
|
175
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
176
|
+
size="large"
|
|
177
|
+
>
|
|
178
|
+
<MenuIcon/>
|
|
179
|
+
</IconButton>
|
|
180
|
+
</div>
|
|
181
|
+
</Tooltip>
|
|
182
|
+
)}
|
|
183
|
+
|
|
184
|
+
<div
|
|
185
|
+
className={`z-20 absolute right-0 top-4 ${
|
|
186
|
+
props.open ? "opacity-100" : "opacity-0 invisible"
|
|
187
|
+
} transition-opacity duration-200 ease-in-out`}>
|
|
188
|
+
<IconButton
|
|
189
|
+
aria-label="Close drawer"
|
|
190
|
+
onClick={() => props.setDrawerOpen(false)}
|
|
191
|
+
>
|
|
192
|
+
<ChevronLeftIcon/>
|
|
193
|
+
</IconButton>
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
<div className={"flex flex-col h-full"}>
|
|
197
|
+
{props.children}
|
|
198
|
+
</div>
|
|
199
|
+
|
|
200
|
+
</div>;
|
|
201
|
+
|
|
202
|
+
const largeLayout = useLargeLayout();
|
|
203
|
+
if (!largeLayout) {
|
|
204
|
+
if (!props.displayed)
|
|
205
|
+
return null;
|
|
206
|
+
return <>
|
|
207
|
+
<IconButton
|
|
208
|
+
color="inherit"
|
|
209
|
+
aria-label="Open drawer"
|
|
210
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
211
|
+
size="large"
|
|
212
|
+
className="absolute sm:top-2 sm:left-4 top-1 left-2"
|
|
213
|
+
>
|
|
214
|
+
<MenuIcon/>
|
|
215
|
+
</IconButton>
|
|
216
|
+
<Sheet side={"left"}
|
|
217
|
+
transparent={true}
|
|
218
|
+
open={props.open}
|
|
219
|
+
onOpenChange={props.setDrawerOpen}
|
|
220
|
+
title={"Navigation drawer"}
|
|
221
|
+
overlayClassName={"bg-white bg-opacity-80"}
|
|
222
|
+
>
|
|
223
|
+
{innerDrawer}
|
|
224
|
+
</Sheet>
|
|
225
|
+
</>;
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
return (
|
|
229
|
+
<div
|
|
230
|
+
className="z-20 relative"
|
|
231
|
+
onMouseEnter={props.onMouseEnter}
|
|
232
|
+
onMouseMove={props.onMouseMove}
|
|
233
|
+
onMouseLeave={props.onMouseLeave}
|
|
234
|
+
style={{
|
|
235
|
+
width,
|
|
236
|
+
transition: "left 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, opacity 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms, width 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms"
|
|
237
|
+
}}>
|
|
238
|
+
|
|
239
|
+
{innerDrawer}
|
|
240
|
+
|
|
241
|
+
</div>
|
|
242
|
+
);
|
|
243
|
+
}
|
package/src/app/index.ts
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* This context represents the state of the app in terms of layout.
|
|
5
|
+
* @group Core
|
|
6
|
+
*/
|
|
7
|
+
export type AppState = {
|
|
8
|
+
hasDrawer: boolean,
|
|
9
|
+
drawerHovered: boolean,
|
|
10
|
+
drawerOpen: boolean,
|
|
11
|
+
openDrawer: () => void,
|
|
12
|
+
closeDrawer: () => void,
|
|
13
|
+
autoOpenDrawer?: boolean,
|
|
14
|
+
logo?: string
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export const AppContext = React.createContext<AppState>({
|
|
18
|
+
hasDrawer: false,
|
|
19
|
+
drawerHovered: false,
|
|
20
|
+
drawerOpen: false,
|
|
21
|
+
openDrawer: () => {
|
|
22
|
+
throw new Error("openDrawer not implemented");
|
|
23
|
+
},
|
|
24
|
+
closeDrawer: () => {
|
|
25
|
+
throw new Error("closeDrawer not implemented");
|
|
26
|
+
},
|
|
27
|
+
autoOpenDrawer: false
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
export function useApp() {
|
|
31
|
+
return React.useContext(AppContext);
|
|
32
|
+
}
|
|
@@ -6,9 +6,12 @@ import { getHashValue } from "../util";
|
|
|
6
6
|
import {
|
|
7
7
|
AddIcon,
|
|
8
8
|
Button,
|
|
9
|
+
cls,
|
|
9
10
|
ContentCopyIcon,
|
|
10
|
-
|
|
11
|
+
HandleIcon,
|
|
11
12
|
IconButton,
|
|
13
|
+
KeyboardArrowDownIcon,
|
|
14
|
+
KeyboardArrowUpIcon,
|
|
12
15
|
Menu,
|
|
13
16
|
MenuItem,
|
|
14
17
|
RemoveIcon,
|
|
@@ -16,17 +19,28 @@ import {
|
|
|
16
19
|
useOutsideAlerter
|
|
17
20
|
} from "@firecms/ui";
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
export type ArrayEntryParams = {
|
|
23
|
+
index: number,
|
|
24
|
+
internalId: number,
|
|
25
|
+
isDragging: boolean,
|
|
26
|
+
storedProps?: object,
|
|
27
|
+
storeProps: (props: object) => void
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type ArrayEntryBuilder = (params: ArrayEntryParams) => React.ReactNode;
|
|
31
|
+
|
|
32
|
+
export interface ArrayContainerProps<T> {
|
|
20
33
|
droppableId: string;
|
|
21
34
|
value: T[];
|
|
22
35
|
addLabel: string;
|
|
23
|
-
buildEntry:
|
|
36
|
+
buildEntry: ArrayEntryBuilder;
|
|
24
37
|
disabled?: boolean;
|
|
25
38
|
size?: "small" | "medium";
|
|
26
39
|
onInternalIdAdded?: (id: number) => void;
|
|
27
40
|
includeAddButton?: boolean;
|
|
28
41
|
newDefaultEntry: T;
|
|
29
|
-
onValueChange: (value: T[]) => void
|
|
42
|
+
onValueChange: (value: T[]) => void,
|
|
43
|
+
className?: string;
|
|
30
44
|
}
|
|
31
45
|
|
|
32
46
|
const buildIdsMap = (value: any[]) =>
|
|
@@ -52,7 +66,8 @@ export function ArrayContainer<T>({
|
|
|
52
66
|
onInternalIdAdded,
|
|
53
67
|
includeAddButton,
|
|
54
68
|
newDefaultEntry,
|
|
55
|
-
onValueChange
|
|
69
|
+
onValueChange,
|
|
70
|
+
className
|
|
56
71
|
}: ArrayContainerProps<T>) {
|
|
57
72
|
|
|
58
73
|
const hasValue = value && Array.isArray(value) && value.length > 0;
|
|
@@ -65,6 +80,12 @@ export function ArrayContainer<T>({
|
|
|
65
80
|
? Object.values(internalIdsRef.current)
|
|
66
81
|
: []);
|
|
67
82
|
|
|
83
|
+
const itemCustomPropsRef = useRef<Record<number, object>>({});
|
|
84
|
+
|
|
85
|
+
const updateItemCustomProps = useCallback((internalId: number, customProps: object) => {
|
|
86
|
+
itemCustomPropsRef.current[internalId] = customProps;
|
|
87
|
+
}, []);
|
|
88
|
+
|
|
68
89
|
useEffect(() => {
|
|
69
90
|
if (hasValue && value && value.length !== internalIds.length) {
|
|
70
91
|
const newInternalIds = value.map((v, index) => {
|
|
@@ -113,6 +134,18 @@ export function ArrayContainer<T>({
|
|
|
113
134
|
onValueChange([...value.slice(0, index + 1), copyingItem, ...value.slice(index + 1)]);
|
|
114
135
|
};
|
|
115
136
|
|
|
137
|
+
const addInIndex = (index: number) => {
|
|
138
|
+
const id = getRandomId();
|
|
139
|
+
const newIds: number[] = [
|
|
140
|
+
...internalIds.splice(0, index),
|
|
141
|
+
id,
|
|
142
|
+
...internalIds.slice(index)];
|
|
143
|
+
if (onInternalIdAdded)
|
|
144
|
+
onInternalIdAdded(id);
|
|
145
|
+
setInternalIds(newIds);
|
|
146
|
+
onValueChange([...value.slice(0, index), newDefaultEntry, ...value.slice(index)]);
|
|
147
|
+
}
|
|
148
|
+
|
|
116
149
|
const onDragEnd = (result: any) => {
|
|
117
150
|
// dropped outside the list
|
|
118
151
|
if (!result.destination) {
|
|
@@ -147,12 +180,16 @@ export function ArrayContainer<T>({
|
|
|
147
180
|
remove={remove}
|
|
148
181
|
copy={copy}
|
|
149
182
|
isDragging={snapshot.isDragging}
|
|
183
|
+
storedProps={itemCustomPropsRef.current[internalId]}
|
|
184
|
+
updateItemCustomProps={updateItemCustomProps}
|
|
185
|
+
addInIndex={addInIndex}
|
|
150
186
|
/>
|
|
151
187
|
);
|
|
152
188
|
}}
|
|
153
189
|
>
|
|
154
190
|
{(droppableProvided, droppableSnapshot) => (
|
|
155
191
|
<div
|
|
192
|
+
className={cls("space-y-1", className)}
|
|
156
193
|
{...droppableProvided.droppableProps}
|
|
157
194
|
ref={droppableProvided.innerRef}>
|
|
158
195
|
{hasValue && internalIds.map((internalId: number, index: number) => {
|
|
@@ -173,6 +210,9 @@ export function ArrayContainer<T>({
|
|
|
173
210
|
remove={remove}
|
|
174
211
|
copy={copy}
|
|
175
212
|
isDragging={snapshot.isDragging}
|
|
213
|
+
storedProps={itemCustomPropsRef.current[internalId]}
|
|
214
|
+
updateItemCustomProps={updateItemCustomProps}
|
|
215
|
+
addInIndex={addInIndex}
|
|
176
216
|
/>
|
|
177
217
|
)}
|
|
178
218
|
</Draggable>
|
|
@@ -205,10 +245,13 @@ type ArrayContainerItemProps = {
|
|
|
205
245
|
internalId: number,
|
|
206
246
|
size?: "small" | "medium",
|
|
207
247
|
disabled: boolean,
|
|
208
|
-
buildEntry:
|
|
248
|
+
buildEntry: ArrayEntryBuilder,
|
|
209
249
|
remove: (index: number) => void,
|
|
210
250
|
copy: (index: number) => void,
|
|
251
|
+
addInIndex?: (index: number) => void,
|
|
211
252
|
isDragging: boolean,
|
|
253
|
+
storedProps?: object,
|
|
254
|
+
updateItemCustomProps: (internalId: number, props: object) => void
|
|
212
255
|
};
|
|
213
256
|
|
|
214
257
|
export function ArrayContainerItem({
|
|
@@ -219,41 +262,44 @@ export function ArrayContainerItem({
|
|
|
219
262
|
disabled,
|
|
220
263
|
buildEntry,
|
|
221
264
|
remove,
|
|
265
|
+
addInIndex,
|
|
222
266
|
copy,
|
|
223
|
-
isDragging
|
|
267
|
+
isDragging,
|
|
268
|
+
storedProps,
|
|
269
|
+
updateItemCustomProps
|
|
224
270
|
}: ArrayContainerItemProps) {
|
|
225
271
|
|
|
226
|
-
const [onHover, setOnHover] = React.useState(false);
|
|
227
|
-
const setOnHoverTrue = useCallback(() => setOnHover(true), []);
|
|
228
|
-
const setOnHoverFalse = useCallback(() => setOnHover(false), []);
|
|
229
|
-
|
|
230
272
|
return <div
|
|
231
|
-
onMouseEnter={setOnHoverTrue}
|
|
232
|
-
onMouseMove={setOnHoverTrue}
|
|
233
|
-
onMouseLeave={setOnHoverFalse}
|
|
234
273
|
ref={provided.innerRef}
|
|
235
274
|
{...provided.draggableProps}
|
|
236
275
|
style={provided.draggableProps.style}
|
|
237
276
|
className={`${
|
|
238
|
-
|
|
239
|
-
}
|
|
277
|
+
!isDragging ? "hover:bg-surface-accent-50 dark:hover:bg-surface-800 dark:hover:bg-opacity-20" : ""
|
|
278
|
+
} rounded-md opacity-100`}
|
|
240
279
|
>
|
|
241
280
|
<div
|
|
242
281
|
className="flex items-start">
|
|
243
|
-
<div
|
|
244
|
-
|
|
282
|
+
<div
|
|
283
|
+
className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
|
|
284
|
+
{buildEntry({
|
|
285
|
+
index,
|
|
286
|
+
internalId,
|
|
287
|
+
isDragging,
|
|
288
|
+
storedProps,
|
|
289
|
+
storeProps: (props: object) => updateItemCustomProps(internalId, props)
|
|
290
|
+
})}
|
|
245
291
|
</div>
|
|
246
292
|
<ArrayItemOptions direction={size === "small" ? "row" : "column"}
|
|
247
293
|
disabled={disabled}
|
|
248
294
|
remove={remove}
|
|
249
295
|
index={index}
|
|
250
296
|
provided={provided}
|
|
297
|
+
addInIndex={addInIndex}
|
|
251
298
|
copy={copy}/>
|
|
252
299
|
</div>
|
|
253
300
|
</div>;
|
|
254
301
|
}
|
|
255
302
|
|
|
256
|
-
|
|
257
303
|
export function ArrayItemOptions({
|
|
258
304
|
direction,
|
|
259
305
|
disabled,
|
|
@@ -261,13 +307,15 @@ export function ArrayItemOptions({
|
|
|
261
307
|
index,
|
|
262
308
|
provided,
|
|
263
309
|
copy,
|
|
310
|
+
addInIndex
|
|
264
311
|
}: {
|
|
265
312
|
direction?: "row" | "column",
|
|
266
313
|
disabled: boolean,
|
|
267
314
|
remove: (index: number) => void,
|
|
268
315
|
index: number,
|
|
269
316
|
provided: any,
|
|
270
|
-
copy: (index: number) => void
|
|
317
|
+
copy: (index: number) => void,
|
|
318
|
+
addInIndex?: (index: number) => void
|
|
271
319
|
}) {
|
|
272
320
|
|
|
273
321
|
const [menuOpen, setMenuOpen] = useState(false);
|
|
@@ -275,7 +323,7 @@ export function ArrayItemOptions({
|
|
|
275
323
|
const iconRef = React.useRef<HTMLDivElement>(null);
|
|
276
324
|
useOutsideAlerter(iconRef, () => setMenuOpen(false));
|
|
277
325
|
|
|
278
|
-
return <div className={`pl-2 pt-1 pb-
|
|
326
|
+
return <div className={`pl-2 pt-1 pb-1 flex ${direction === "row" ? "flex-row-reverse" : "flex-col"} items-center`}
|
|
279
327
|
ref={iconRef}
|
|
280
328
|
{...provided.dragHandleProps}>
|
|
281
329
|
<Tooltip
|
|
@@ -283,11 +331,13 @@ export function ArrayItemOptions({
|
|
|
283
331
|
open={menuOpen ? false : undefined}
|
|
284
332
|
side={direction === "column" ? "left" : undefined}
|
|
285
333
|
title="Drag to move. Click for more options">
|
|
286
|
-
|
|
287
334
|
<IconButton
|
|
288
335
|
size="small"
|
|
289
336
|
disabled={disabled}
|
|
290
|
-
onClick={() =>
|
|
337
|
+
onClick={(e) => {
|
|
338
|
+
e.preventDefault();
|
|
339
|
+
setMenuOpen(true);
|
|
340
|
+
}}
|
|
291
341
|
onDragStart={(e: any) => {
|
|
292
342
|
setMenuOpen(false);
|
|
293
343
|
}}
|
|
@@ -298,7 +348,7 @@ export function ArrayItemOptions({
|
|
|
298
348
|
<Menu
|
|
299
349
|
portalContainer={iconRef.current}
|
|
300
350
|
open={menuOpen}
|
|
301
|
-
trigger={<div/>}>
|
|
351
|
+
trigger={<div tabIndex={-1}/>}>
|
|
302
352
|
|
|
303
353
|
<MenuItem dense onClick={(e) => {
|
|
304
354
|
setMenuOpen(false);
|
|
@@ -315,8 +365,25 @@ export function ArrayItemOptions({
|
|
|
315
365
|
Copy
|
|
316
366
|
</MenuItem>
|
|
317
367
|
|
|
318
|
-
|
|
368
|
+
{addInIndex && <MenuItem dense
|
|
369
|
+
onClick={() => {
|
|
370
|
+
setMenuOpen(false);
|
|
371
|
+
addInIndex(index);
|
|
372
|
+
}}>
|
|
373
|
+
<KeyboardArrowUpIcon size={"small"}/>
|
|
374
|
+
Add on top
|
|
375
|
+
</MenuItem>}
|
|
376
|
+
|
|
377
|
+
{addInIndex && <MenuItem dense
|
|
378
|
+
onClick={() => {
|
|
379
|
+
setMenuOpen(false);
|
|
380
|
+
addInIndex(index + 1);
|
|
381
|
+
}}>
|
|
382
|
+
<KeyboardArrowDownIcon size={"small"}/>
|
|
383
|
+
Add below
|
|
384
|
+
</MenuItem>}
|
|
319
385
|
|
|
386
|
+
</Menu>
|
|
320
387
|
</Tooltip>
|
|
321
388
|
|
|
322
389
|
</div>;
|
|
@@ -5,7 +5,7 @@ import { CircularProgress, CircularProgressProps, Typography } from "@firecms/ui
|
|
|
5
5
|
*
|
|
6
6
|
* @param text
|
|
7
7
|
* @param props
|
|
8
|
-
|
|
8
|
+
|
|
9
9
|
* @ignore
|
|
10
10
|
*/
|
|
11
11
|
export function CircularProgressCenter({ text, ...props }: CircularProgressProps & {
|
|
@@ -13,7 +13,7 @@ export function CircularProgressCenter({ text, ...props }: CircularProgressProps
|
|
|
13
13
|
}) {
|
|
14
14
|
return (
|
|
15
15
|
<div
|
|
16
|
-
className="flex w-full h-screen max-h-full max-w-full bg-
|
|
16
|
+
className="flex w-full h-screen max-h-full max-w-full bg-surface-50 dark:bg-surface-900 gap-4">
|
|
17
17
|
<div className="m-auto flex flex-col gap-2 items-center">
|
|
18
18
|
<CircularProgress {...props}/>
|
|
19
19
|
{text && <Typography
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { Button, FilterListOffIcon } from "@firecms/ui";
|
|
2
|
+
import { EntityTableController } from "../types";
|
|
3
|
+
|
|
4
|
+
export function ClearFilterSortButton({
|
|
5
|
+
tableController,
|
|
6
|
+
enabled
|
|
7
|
+
}: {
|
|
8
|
+
enabled: boolean;
|
|
9
|
+
tableController: EntityTableController
|
|
10
|
+
}) {
|
|
11
|
+
if (!enabled) {
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
|
|
16
|
+
const sortIsSet = !!tableController.sortBy && tableController.sortBy.length > 0;
|
|
17
|
+
|
|
18
|
+
if ((filterIsSet || sortIsSet) && (tableController.clearFilter || tableController.setSortBy)) {
|
|
19
|
+
let label;
|
|
20
|
+
if (filterIsSet && sortIsSet) {
|
|
21
|
+
label = "Clear filter and sort";
|
|
22
|
+
} else if (filterIsSet) {
|
|
23
|
+
label = "Clear filter";
|
|
24
|
+
} else {
|
|
25
|
+
label = "Clear sort";
|
|
26
|
+
}
|
|
27
|
+
return <Button
|
|
28
|
+
variant={"outlined"}
|
|
29
|
+
className="h-fit-content"
|
|
30
|
+
aria-label="filter clear"
|
|
31
|
+
onClick={() => {
|
|
32
|
+
tableController.clearFilter?.();
|
|
33
|
+
tableController.setSortBy?.(undefined);
|
|
34
|
+
}}
|
|
35
|
+
size={"small"}>
|
|
36
|
+
<FilterListOffIcon/>
|
|
37
|
+
{label}
|
|
38
|
+
</Button>
|
|
39
|
+
}
|
|
40
|
+
return null;
|
|
41
|
+
}
|
|
@@ -58,7 +58,7 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
58
58
|
const resolvedCollection = useMemo(() => resolveCollection<M>({
|
|
59
59
|
collection,
|
|
60
60
|
path,
|
|
61
|
-
|
|
61
|
+
propertyConfigs: customizationController.propertyConfigs
|
|
62
62
|
}), [collection, path]);
|
|
63
63
|
|
|
64
64
|
const handleCancel = useCallback(() => {
|