@firecms/core 3.0.0-canary.12 → 3.0.0-canary.120
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 +1 -1
- package/dist/app/AppBar.d.ts +12 -0
- package/dist/app/Drawer.d.ts +17 -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 +2 -1
- package/dist/components/CircularProgressCenter.d.ts +1 -1
- package/dist/components/ClearFilterSortButton.d.ts +5 -0
- 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 +5 -3
- 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 +2 -2
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityPreview.d.ts +6 -5
- 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/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 +3 -0
- package/dist/components/index.d.ts +3 -1
- 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 +1 -1
- 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/FormikArrayContainer.d.ts +2 -1
- 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 -0
- 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 +1 -1
- package/dist/form/field_bindings/ReadOnlyFieldBinding.d.ts +1 -1
- 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 +2 -4
- package/dist/form/useClearRestoreValue.d.ts +2 -2
- package/dist/hooks/data/save.d.ts +1 -2
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/useBuildNavigationController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +4 -8
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +15742 -12458
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +19965 -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 +3 -3
- package/dist/types/collections.d.ts +39 -5
- package/dist/types/datasource.d.ts +55 -35
- package/dist/types/entities.d.ts +6 -1
- package/dist/types/entity_actions.d.ts +14 -0
- package/dist/types/entity_overrides.d.ts +2 -2
- package/dist/types/fields.d.ts +47 -41
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +6 -5
- package/dist/types/plugins.d.ts +14 -4
- package/dist/types/properties.d.ts +34 -21
- package/dist/types/side_dialogs_controller.d.ts +10 -0
- package/dist/types/storage.d.ts +11 -3
- 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 +3 -2
- package/dist/util/index.d.ts +1 -0
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/objects.d.ts +1 -1
- package/dist/util/plurals.d.ts +0 -2
- package/dist/util/property_utils.d.ts +1 -1
- package/dist/util/resolutions.d.ts +27 -13
- 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 +25 -0
- package/src/app/Scaffold.tsx +245 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ArrayContainer.tsx +15 -10
- package/src/components/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +12 -19
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +41 -35
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +32 -17
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +14 -6
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +17 -13
- package/src/components/EntityCollectionTable/internal/EntityTableCellActions.tsx +19 -7
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +7 -10
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +75 -51
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityPreview.tsx +38 -34
- package/src/components/EntityView.tsx +5 -5
- package/src/components/ErrorView.tsx +1 -1
- package/src/components/HomePage/DefaultHomePage.tsx +26 -19
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -6
- package/src/components/PropertyIdCopyTooltip.tsx +48 -0
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +8 -6
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +11 -7
- package/src/components/SelectableTable/SelectableTable.tsx +7 -7
- 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 +35 -15
- package/src/components/VirtualTable/VirtualTable.tsx +70 -37
- package/src/components/VirtualTable/VirtualTableCell.tsx +1 -1
- package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +18 -14
- package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
- 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 +0 -2
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +2 -2
- 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 +11 -0
- package/src/components/common/useTableSearchHelper.ts +53 -12
- package/src/components/index.tsx +3 -1
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
- package/src/core/DefaultDrawer.tsx +179 -0
- package/src/core/DrawerNavigationItem.tsx +66 -0
- package/src/core/EntityEditView.tsx +716 -149
- package/src/core/EntitySidePanel.tsx +1 -2
- package/src/core/FireCMS.tsx +39 -44
- package/src/core/NavigationRoutes.tsx +7 -8
- package/src/core/SideDialogs.tsx +2 -0
- package/src/core/field_configs.tsx +4 -5
- package/src/core/index.tsx +3 -4
- package/src/form/PropertyFieldBinding.tsx +53 -21
- package/src/form/components/CustomIdField.tsx +4 -2
- package/src/form/components/FieldHelperText.tsx +4 -4
- package/src/form/components/FormikArrayContainer.tsx +4 -1
- package/src/form/components/LabelWithIcon.tsx +27 -19
- package/src/form/components/LabelWithIconAndTooltip.tsx +28 -0
- package/src/form/components/StorageItemPreview.tsx +21 -11
- package/src/form/components/StorageUploadProgress.tsx +3 -4
- package/src/form/components/index.tsx +1 -0
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +26 -15
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +29 -24
- package/src/form/field_bindings/BlockFieldBinding.tsx +14 -12
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +17 -14
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +52 -46
- package/src/form/field_bindings/MapFieldBinding.tsx +17 -17
- package/src/form/field_bindings/MarkdownEditorFieldBinding.tsx +150 -0
- package/src/form/field_bindings/MultiSelectBinding.tsx +9 -5
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +11 -16
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +41 -30
- package/src/form/field_bindings/RepeatFieldBinding.tsx +32 -19
- 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 +2 -7
- package/src/form/useClearRestoreValue.tsx +2 -2
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +2 -1
- package/src/hooks/data/save.ts +6 -1
- package/src/hooks/data/useDataSource.tsx +11 -3
- package/src/hooks/index.tsx +1 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +11 -5
- package/src/hooks/useBuildNavigationController.tsx +91 -31
- package/src/hooks/useProjectLog.tsx +19 -8
- package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
- package/src/hooks/useValidateAuthenticator.tsx +21 -41
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +77 -81
- 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 +10 -17
- package/src/preview/PropertyPreviewProps.tsx +7 -1
- package/src/preview/components/BooleanPreview.tsx +2 -2
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ImagePreview.tsx +24 -34
- 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 +1 -2
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +3 -2
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +1 -2
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +3 -4
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +3 -4
- 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 +3 -3
- package/src/types/collections.ts +48 -7
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +65 -43
- package/src/types/entities.ts +11 -1
- package/src/types/entity_actions.tsx +16 -3
- package/src/types/entity_overrides.tsx +2 -2
- package/src/types/fields.tsx +51 -45
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +7 -7
- package/src/types/plugins.tsx +16 -6
- package/src/types/properties.ts +39 -22
- package/src/types/side_dialogs_controller.tsx +13 -0
- package/src/types/storage.ts +12 -3
- 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 +8 -2
- package/src/util/index.ts +1 -0
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +25 -28
- package/src/util/permissions.ts +1 -0
- package/src/util/plurals.ts +0 -2
- package/src/util/property_utils.tsx +1 -1
- package/src/util/references.ts +3 -0
- package/src/util/resolutions.ts +74 -41
- 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/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/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/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,245 @@
|
|
|
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-gray-50 dark:bg-gray-900 text-gray-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-[68px]"></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
|
+
>
|
|
171
|
+
<div
|
|
172
|
+
className="fixed top-2 left-3 !bg-gray-50 dark:!bg-gray-900 rounded-full w-fit z-20">
|
|
173
|
+
<IconButton
|
|
174
|
+
color="inherit"
|
|
175
|
+
aria-label="Open menu"
|
|
176
|
+
className="sticky top-2 left-3 "
|
|
177
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
178
|
+
size="large"
|
|
179
|
+
>
|
|
180
|
+
<MenuIcon/>
|
|
181
|
+
</IconButton>
|
|
182
|
+
</div>
|
|
183
|
+
</Tooltip>
|
|
184
|
+
)}
|
|
185
|
+
|
|
186
|
+
<div
|
|
187
|
+
className={`z-20 absolute right-0 top-4 ${
|
|
188
|
+
props.open ? "opacity-100" : "opacity-0 invisible"
|
|
189
|
+
} transition-opacity duration-200 ease-in-out`}>
|
|
190
|
+
<IconButton
|
|
191
|
+
aria-label="Close drawer"
|
|
192
|
+
onClick={() => props.setDrawerOpen(false)}
|
|
193
|
+
>
|
|
194
|
+
<ChevronLeftIcon/>
|
|
195
|
+
</IconButton>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
<div className={"flex flex-col h-full"}>
|
|
199
|
+
{props.children}
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
</div>;
|
|
203
|
+
|
|
204
|
+
const largeLayout = useLargeLayout();
|
|
205
|
+
if (!largeLayout) {
|
|
206
|
+
if (!props.displayed)
|
|
207
|
+
return null;
|
|
208
|
+
return <>
|
|
209
|
+
<IconButton
|
|
210
|
+
color="inherit"
|
|
211
|
+
aria-label="Open drawer"
|
|
212
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
213
|
+
size="large"
|
|
214
|
+
className="absolute top-2 left-6"
|
|
215
|
+
>
|
|
216
|
+
<MenuIcon/>
|
|
217
|
+
</IconButton>
|
|
218
|
+
<Sheet side={"left"}
|
|
219
|
+
transparent={true}
|
|
220
|
+
open={props.open}
|
|
221
|
+
onOpenChange={props.setDrawerOpen}
|
|
222
|
+
title={"Navigaion drawer"}
|
|
223
|
+
overlayClassName={"bg-white bg-opacity-80"}
|
|
224
|
+
>
|
|
225
|
+
{innerDrawer}
|
|
226
|
+
</Sheet>
|
|
227
|
+
</>;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
return (
|
|
231
|
+
<div
|
|
232
|
+
className="z-20 relative"
|
|
233
|
+
onMouseEnter={props.onMouseEnter}
|
|
234
|
+
onMouseMove={props.onMouseMove}
|
|
235
|
+
onMouseLeave={props.onMouseLeave}
|
|
236
|
+
style={{
|
|
237
|
+
width,
|
|
238
|
+
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"
|
|
239
|
+
}}>
|
|
240
|
+
|
|
241
|
+
{innerDrawer}
|
|
242
|
+
|
|
243
|
+
</div>
|
|
244
|
+
);
|
|
245
|
+
}
|
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
|
+
}
|
|
@@ -7,7 +7,8 @@ import {
|
|
|
7
7
|
AddIcon,
|
|
8
8
|
Button,
|
|
9
9
|
ContentCopyIcon,
|
|
10
|
-
fieldBackgroundHoverMixin,
|
|
10
|
+
fieldBackgroundHoverMixin,
|
|
11
|
+
HandleIcon,
|
|
11
12
|
IconButton,
|
|
12
13
|
Menu,
|
|
13
14
|
MenuItem,
|
|
@@ -26,7 +27,8 @@ interface ArrayContainerProps<T> {
|
|
|
26
27
|
onInternalIdAdded?: (id: number) => void;
|
|
27
28
|
includeAddButton?: boolean;
|
|
28
29
|
newDefaultEntry: T;
|
|
29
|
-
onValueChange: (value: T[]) => void
|
|
30
|
+
onValueChange: (value: T[]) => void,
|
|
31
|
+
className?: string;
|
|
30
32
|
}
|
|
31
33
|
|
|
32
34
|
const buildIdsMap = (value: any[]) =>
|
|
@@ -52,7 +54,8 @@ export function ArrayContainer<T>({
|
|
|
52
54
|
onInternalIdAdded,
|
|
53
55
|
includeAddButton,
|
|
54
56
|
newDefaultEntry,
|
|
55
|
-
onValueChange
|
|
57
|
+
onValueChange,
|
|
58
|
+
className
|
|
56
59
|
}: ArrayContainerProps<T>) {
|
|
57
60
|
|
|
58
61
|
const hasValue = value && Array.isArray(value) && value.length > 0;
|
|
@@ -153,6 +156,7 @@ export function ArrayContainer<T>({
|
|
|
153
156
|
>
|
|
154
157
|
{(droppableProvided, droppableSnapshot) => (
|
|
155
158
|
<div
|
|
159
|
+
className={className}
|
|
156
160
|
{...droppableProvided.droppableProps}
|
|
157
161
|
ref={droppableProvided.innerRef}>
|
|
158
162
|
{hasValue && internalIds.map((internalId: number, index: number) => {
|
|
@@ -235,12 +239,13 @@ export function ArrayContainerItem({
|
|
|
235
239
|
{...provided.draggableProps}
|
|
236
240
|
style={provided.draggableProps.style}
|
|
237
241
|
className={`${
|
|
238
|
-
(isDragging || onHover) ?
|
|
242
|
+
(isDragging || onHover) ? "hover:bg-slate-50 dark:hover:bg-gray-800 dark:hover:bg-opacity-20" : ""
|
|
239
243
|
} mb-1 rounded-md opacity-100`}
|
|
240
244
|
>
|
|
241
245
|
<div
|
|
242
246
|
className="flex items-start">
|
|
243
|
-
<div
|
|
247
|
+
<div
|
|
248
|
+
className="flex-grow w-[calc(100%-48px)] text-text-primary dark:text-text-primary-dark">
|
|
244
249
|
{buildEntry(index, internalId)}
|
|
245
250
|
</div>
|
|
246
251
|
<ArrayItemOptions direction={size === "small" ? "row" : "column"}
|
|
@@ -253,7 +258,6 @@ export function ArrayContainerItem({
|
|
|
253
258
|
</div>;
|
|
254
259
|
}
|
|
255
260
|
|
|
256
|
-
|
|
257
261
|
export function ArrayItemOptions({
|
|
258
262
|
direction,
|
|
259
263
|
disabled,
|
|
@@ -283,11 +287,13 @@ export function ArrayItemOptions({
|
|
|
283
287
|
open={menuOpen ? false : undefined}
|
|
284
288
|
side={direction === "column" ? "left" : undefined}
|
|
285
289
|
title="Drag to move. Click for more options">
|
|
286
|
-
|
|
287
290
|
<IconButton
|
|
288
291
|
size="small"
|
|
289
292
|
disabled={disabled}
|
|
290
|
-
onClick={() =>
|
|
293
|
+
onClick={(e) => {
|
|
294
|
+
e.preventDefault();
|
|
295
|
+
setMenuOpen(true);
|
|
296
|
+
}}
|
|
291
297
|
onDragStart={(e: any) => {
|
|
292
298
|
setMenuOpen(false);
|
|
293
299
|
}}
|
|
@@ -298,7 +304,7 @@ export function ArrayItemOptions({
|
|
|
298
304
|
<Menu
|
|
299
305
|
portalContainer={iconRef.current}
|
|
300
306
|
open={menuOpen}
|
|
301
|
-
trigger={<div/>}>
|
|
307
|
+
trigger={<div tabIndex={-1}/>}>
|
|
302
308
|
|
|
303
309
|
<MenuItem dense onClick={(e) => {
|
|
304
310
|
setMenuOpen(false);
|
|
@@ -316,7 +322,6 @@ export function ArrayItemOptions({
|
|
|
316
322
|
</MenuItem>
|
|
317
323
|
|
|
318
324
|
</Menu>
|
|
319
|
-
|
|
320
325
|
</Tooltip>
|
|
321
326
|
|
|
322
327
|
</div>;
|
|
@@ -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
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import React, { MouseEvent, useCallback } from "react";
|
|
2
2
|
|
|
3
3
|
import { CollectionSize, Entity, EntityAction, EntityCollection, SelectionController } from "../../types";
|
|
4
|
-
import { Checkbox,
|
|
4
|
+
import { Checkbox, cls, IconButton, Menu, MenuItem, MoreVertIcon, Skeleton, Tooltip } from "@firecms/ui";
|
|
5
5
|
import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -14,7 +14,6 @@ import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
|
14
14
|
* @param size
|
|
15
15
|
* @param toggleEntitySelection
|
|
16
16
|
* @param hideId
|
|
17
|
-
* @constructor
|
|
18
17
|
*
|
|
19
18
|
* @group Collection components
|
|
20
19
|
*/
|
|
@@ -56,12 +55,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
56
55
|
const context = useFireCMSContext();
|
|
57
56
|
|
|
58
57
|
const onCheckedChange = useCallback((checked: boolean) => {
|
|
59
|
-
selectionController?.toggleEntitySelection(entity);
|
|
60
|
-
}, [entity, selectionController?.toggleEntitySelection]);
|
|
61
|
-
|
|
62
|
-
const onClick = useCallback((event: MouseEvent) => {
|
|
63
|
-
event.stopPropagation();
|
|
64
|
-
selectionController?.toggleEntitySelection(entity);
|
|
58
|
+
selectionController?.toggleEntitySelection(entity, checked);
|
|
65
59
|
}, [entity, selectionController?.toggleEntitySelection]);
|
|
66
60
|
|
|
67
61
|
const hasActions = actions.length > 0;
|
|
@@ -71,8 +65,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
71
65
|
const uncollapsedActions = actions.filter(a => a.collapsed === false);
|
|
72
66
|
return (
|
|
73
67
|
<div
|
|
74
|
-
|
|
75
|
-
className={cn(
|
|
68
|
+
className={cls(
|
|
76
69
|
"h-full flex items-center justify-center flex-col bg-gray-50 dark:bg-gray-900 bg-opacity-90 dark:bg-opacity-90 z-10",
|
|
77
70
|
frozen ? "sticky left-0" : ""
|
|
78
71
|
)}
|
|
@@ -87,7 +80,9 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
87
80
|
<div className="w-34 flex justify-center">
|
|
88
81
|
|
|
89
82
|
{uncollapsedActions.map((action, index) => (
|
|
90
|
-
<Tooltip key={index}
|
|
83
|
+
<Tooltip key={index}
|
|
84
|
+
title={action.name}
|
|
85
|
+
asChild={true}>
|
|
91
86
|
<IconButton
|
|
92
87
|
onClick={(event: MouseEvent) => {
|
|
93
88
|
event.stopPropagation();
|
|
@@ -149,16 +144,14 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
149
144
|
</div>}
|
|
150
145
|
|
|
151
146
|
{!hideId && size !== "xs" && (
|
|
152
|
-
<div
|
|
147
|
+
<div
|
|
148
|
+
className="w-[138px] text-center overflow-hidden truncate font-mono text-xs text-text-secondary dark:text-text-secondary-dark max-w-full text-ellipsis px-2"
|
|
149
|
+
onClick={(event) => {
|
|
150
|
+
event.stopPropagation();
|
|
151
|
+
}}>
|
|
153
152
|
|
|
154
153
|
{entity
|
|
155
|
-
?
|
|
156
|
-
onClick={(event) => {
|
|
157
|
-
event.stopPropagation();
|
|
158
|
-
}}
|
|
159
|
-
className={"font-mono select-all"}
|
|
160
|
-
variant={"caption"}
|
|
161
|
-
color={"secondary"}> {entity.id} </Typography>
|
|
154
|
+
? entity.id
|
|
162
155
|
: <Skeleton/>
|
|
163
156
|
}
|
|
164
157
|
</div>
|
|
@@ -5,7 +5,6 @@ import { ErrorBoundary } from "../ErrorBoundary";
|
|
|
5
5
|
import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
6
6
|
import { CellRendererParams, VirtualTableColumn } from "../VirtualTable";
|
|
7
7
|
import { getValueInPath } from "../../util";
|
|
8
|
-
import { getRowHeight } from "../VirtualTable/common";
|
|
9
8
|
import { EntityCollectionRowActions } from "./EntityCollectionRowActions";
|
|
10
9
|
import { CollectionTableToolbar } from "./internal/CollectionTableToolbar";
|
|
11
10
|
import { EntityCollectionTableProps } from "./EntityCollectionTableProps";
|
|
@@ -15,7 +14,8 @@ import { renderSkeletonText } from "../../preview";
|
|
|
15
14
|
import { propertiesToColumns } from "./column_utils";
|
|
16
15
|
import { ErrorView } from "../ErrorView";
|
|
17
16
|
import { SelectableTable } from "../SelectableTable/SelectableTable";
|
|
18
|
-
|
|
17
|
+
import { cls } from "@firecms/ui";
|
|
18
|
+
import { getRowHeight } from "../common/table_height";
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
21
|
* This component is in charge of rendering a collection table with a high
|
|
@@ -43,6 +43,8 @@ import { SelectableTable } from "../SelectableTable/SelectableTable";
|
|
|
43
43
|
*/
|
|
44
44
|
export const EntityCollectionTable = function EntityCollectionTable<M extends Record<string, any>, UserType extends User>
|
|
45
45
|
({
|
|
46
|
+
className,
|
|
47
|
+
style,
|
|
46
48
|
forceFilter,
|
|
47
49
|
actionsStart,
|
|
48
50
|
actions,
|
|
@@ -73,13 +75,13 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
73
75
|
emptyComponent,
|
|
74
76
|
getIdColumnWidth,
|
|
75
77
|
onTextSearchClick,
|
|
76
|
-
textSearchLoading
|
|
78
|
+
textSearchLoading,
|
|
79
|
+
enablePopupIcon
|
|
77
80
|
}: EntityCollectionTableProps<M>) {
|
|
78
81
|
|
|
79
82
|
const ref = useRef<HTMLDivElement>(null);
|
|
80
83
|
|
|
81
84
|
const largeLayout = useLargeLayout();
|
|
82
|
-
const disabledFilterChange = Boolean(forceFilter);
|
|
83
85
|
const selectedEntities = (selectionController?.selectedEntities?.length > 0 ? selectionController?.selectedEntities : highlightedEntities)?.filter(Boolean);
|
|
84
86
|
|
|
85
87
|
const context: FireCMSContext<UserType> = useFireCMSContext();
|
|
@@ -88,8 +90,6 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
88
90
|
|
|
89
91
|
const selectedEntityIds = selectedEntities?.map(e => e.id);
|
|
90
92
|
|
|
91
|
-
const filterIsSet = !!tableController.filterValues && Object.keys(tableController.filterValues).length > 0;
|
|
92
|
-
|
|
93
93
|
const updateSize = useCallback((size: CollectionSize) => {
|
|
94
94
|
if (onSizeChanged)
|
|
95
95
|
onSizeChanged(size);
|
|
@@ -120,10 +120,8 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
120
120
|
const propertyKey = column.key;
|
|
121
121
|
|
|
122
122
|
let disabled = column.custom?.disabled;
|
|
123
|
-
const propertyValue = entity.values ? getValueInPath(entity.values, propertyKey) : undefined;
|
|
124
123
|
const property = getPropertyFor?.({
|
|
125
124
|
propertyKey,
|
|
126
|
-
propertyValue,
|
|
127
125
|
entity
|
|
128
126
|
}) ?? column.custom.resolvedProperty;
|
|
129
127
|
if (!property?.disabled) {
|
|
@@ -150,6 +148,7 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
150
148
|
height={getRowHeight(size)}
|
|
151
149
|
entity={entity}
|
|
152
150
|
disabled={disabled}
|
|
151
|
+
enablePopupIcon={enablePopupIcon}
|
|
153
152
|
path={entity.path}/>
|
|
154
153
|
: renderSkeletonText()
|
|
155
154
|
}
|
|
@@ -179,7 +178,10 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
179
178
|
|
|
180
179
|
const child = Builder
|
|
181
180
|
? <Builder entity={entity} context={context}/>
|
|
182
|
-
: <>{additionalField.value?.({
|
|
181
|
+
: <>{additionalField.value?.({
|
|
182
|
+
entity,
|
|
183
|
+
context
|
|
184
|
+
})}</>;
|
|
183
185
|
|
|
184
186
|
return (
|
|
185
187
|
<EntityTableCell
|
|
@@ -207,7 +209,6 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
207
209
|
properties,
|
|
208
210
|
sortable,
|
|
209
211
|
forceFilter,
|
|
210
|
-
disabledFilter: disabledFilterChange,
|
|
211
212
|
AdditionalHeaderWidget
|
|
212
213
|
});
|
|
213
214
|
|
|
@@ -237,13 +238,15 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
237
238
|
|
|
238
239
|
const columns: VirtualTableColumn[] = [
|
|
239
240
|
idColumn,
|
|
240
|
-
...displayedColumnIds
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
241
|
+
...(displayedColumnIds
|
|
242
|
+
? displayedColumnIds
|
|
243
|
+
.map((p) => {
|
|
244
|
+
return collectionColumns.find(c => c.key === p.key);
|
|
245
|
+
}).filter(Boolean)
|
|
246
|
+
: collectionColumns) as VirtualTableColumn[]
|
|
244
247
|
];
|
|
245
248
|
|
|
246
|
-
const cellRenderer = (props: CellRendererParams<any>) => {
|
|
249
|
+
const cellRenderer = useCallback((props: CellRendererParams<any>) => {
|
|
247
250
|
const column = props.column;
|
|
248
251
|
const columns = props.columns;
|
|
249
252
|
const columnKey = column.key;
|
|
@@ -283,20 +286,18 @@ export const EntityCollectionTable = function EntityCollectionTable<M extends Re
|
|
|
283
286
|
<ErrorView error={e}/>
|
|
284
287
|
</EntityTableCell>;
|
|
285
288
|
}
|
|
286
|
-
}
|
|
289
|
+
}, [tableRowActionsBuilder, additionalCellRenderer, propertyCellRenderer, size]);
|
|
287
290
|
|
|
288
291
|
return (
|
|
289
292
|
|
|
290
293
|
<div ref={ref}
|
|
291
|
-
|
|
294
|
+
style={style}
|
|
295
|
+
className={cls("h-full w-full flex flex-col bg-white dark:bg-gray-950", className)}>
|
|
292
296
|
|
|
293
297
|
<CollectionTableToolbar
|
|
294
|
-
forceFilter={disabledFilterChange}
|
|
295
|
-
filterIsSet={filterIsSet}
|
|
296
298
|
onTextSearch={textSearchEnabled ? onTextSearch : undefined}
|
|
297
299
|
textSearchLoading={textSearchLoading}
|
|
298
300
|
onTextSearchClick={textSearchEnabled ? onTextSearchClick : undefined}
|
|
299
|
-
clearFilter={tableController.clearFilter}
|
|
300
301
|
size={size}
|
|
301
302
|
onSizeChanged={updateSize}
|
|
302
303
|
title={title}
|
|
@@ -2,7 +2,7 @@ import React from "react";
|
|
|
2
2
|
import {
|
|
3
3
|
AdditionalFieldDelegate,
|
|
4
4
|
CollectionSize,
|
|
5
|
-
Entity,
|
|
5
|
+
Entity,
|
|
6
6
|
EntityTableController,
|
|
7
7
|
FilterValues,
|
|
8
8
|
ResolvedProperties,
|
|
@@ -12,13 +12,16 @@ import {
|
|
|
12
12
|
} from "../../types";
|
|
13
13
|
import { OnCellValueChange, OnColumnResizeParams, UniqueFieldValidator } from "../common/types";
|
|
14
14
|
|
|
15
|
-
|
|
16
15
|
/**
|
|
17
16
|
* @group Collection components
|
|
18
17
|
*/
|
|
19
18
|
export type EntityCollectionTableProps<M extends Record<string, any>,
|
|
20
19
|
UserType extends User = User> = {
|
|
21
20
|
|
|
21
|
+
className?: string;
|
|
22
|
+
|
|
23
|
+
style?: React.CSSProperties;
|
|
24
|
+
|
|
22
25
|
/**
|
|
23
26
|
* Display these entities as selected
|
|
24
27
|
*/
|
|
@@ -92,7 +95,7 @@ export type EntityCollectionTableProps<M extends Record<string, any>,
|
|
|
92
95
|
*/
|
|
93
96
|
tableController: EntityTableController<M>;
|
|
94
97
|
|
|
95
|
-
displayedColumnIds
|
|
98
|
+
displayedColumnIds?: PropertyColumnConfig[];
|
|
96
99
|
|
|
97
100
|
forceFilter?: FilterValues<Extract<keyof M, string>>;
|
|
98
101
|
|
|
@@ -131,15 +134,16 @@ export type EntityCollectionTableProps<M extends Record<string, any>,
|
|
|
131
134
|
onTextSearchClick?: () => void;
|
|
132
135
|
|
|
133
136
|
textSearchLoading?: boolean;
|
|
134
|
-
|
|
137
|
+
|
|
138
|
+
enablePopupIcon: boolean;
|
|
139
|
+
};
|
|
135
140
|
|
|
136
141
|
export type GetPropertyForProps<M extends Record<string, any>> = {
|
|
137
142
|
propertyKey: string,
|
|
138
|
-
propertyValue: any,
|
|
139
143
|
entity: Entity<M>
|
|
140
144
|
};
|
|
141
145
|
|
|
142
146
|
export type PropertyColumnConfig = {
|
|
143
147
|
key: string,
|
|
144
|
-
disabled
|
|
148
|
+
disabled?: boolean,
|
|
145
149
|
};
|