@firecms/core 3.0.0-canary.7 → 3.0.0-canary.70
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 +2 -2
- 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/ClearFilterSortButton.d.ts +5 -0
- package/dist/components/EntityCollectionTable/EntityCollectionRowActions.d.ts +11 -11
- package/dist/components/EntityCollectionTable/EntityCollectionTable.d.ts +2 -2
- package/dist/components/EntityCollectionTable/EntityCollectionTableProps.d.ts +5 -3
- package/dist/components/EntityCollectionTable/PropertyTableCell.d.ts +3 -2
- package/dist/components/EntityCollectionTable/column_utils.d.ts +1 -2
- package/dist/components/EntityCollectionTable/fields/TableReferenceField.d.ts +2 -0
- 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 +1 -1
- package/dist/components/EntityCollectionView/EntityCollectionView.d.ts +12 -3
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityCollectionView/useSelectionController.d.ts +2 -0
- package/dist/components/EntityPreview.d.ts +26 -7
- package/dist/components/EntityView.d.ts +11 -0
- package/dist/components/FieldCaption.d.ts +5 -0
- package/dist/components/HomePage/NavigationCard.d.ts +8 -0
- package/dist/components/HomePage/{NavigationCollectionCard.d.ts → NavigationCardBinding.d.ts} +2 -2
- package/dist/components/HomePage/SmallNavigationCard.d.ts +6 -0
- package/dist/components/HomePage/index.d.ts +3 -1
- 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 +6 -7
- 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/useDataSourceEntityCollectionTableController.d.ts +3 -0
- package/dist/components/index.d.ts +6 -3
- package/dist/contexts/AuthControllerContext.d.ts +1 -1
- package/dist/{components/FireCMSAppBar.d.ts → core/DefaultAppBar.d.ts} +5 -8
- package/dist/core/DefaultDrawer.d.ts +19 -0
- package/dist/core/DrawerNavigationItem.d.ts +9 -0
- package/dist/core/EntityEditView.d.ts +36 -0
- package/dist/core/NavigationRoutes.d.ts +2 -2
- package/dist/core/index.d.ts +3 -4
- package/dist/form/PropertiesForm.d.ts +8 -0
- package/dist/form/components/ErrorFocus.d.ts +1 -1
- package/dist/form/components/FieldHelperText.d.ts +3 -3
- package/dist/form/components/StorageItemPreview.d.ts +2 -3
- package/dist/form/components/StorageUploadProgress.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/StorageUploadFieldBinding.d.ts +3 -4
- package/dist/form/field_bindings/TextFieldBinding.d.ts +2 -2
- package/dist/form/index.d.ts +0 -2
- package/dist/form/validation.d.ts +1 -1
- package/dist/hooks/data/delete.d.ts +2 -2
- package/dist/hooks/data/save.d.ts +2 -3
- package/dist/hooks/data/useDataSource.d.ts +2 -2
- package/dist/hooks/data/useEntityFetch.d.ts +3 -3
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useBuildNavigationController.d.ts +6 -4
- package/dist/hooks/useProjectLog.d.ts +6 -2
- package/dist/hooks/useStorageSource.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +10512 -9997
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +5 -5
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/preview/PropertyPreview.d.ts +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +1 -4
- package/dist/preview/components/BooleanPreview.d.ts +5 -1
- package/dist/preview/components/EnumValuesChip.d.ts +1 -1
- package/dist/preview/components/ReferencePreview.d.ts +3 -8
- package/dist/types/analytics.d.ts +1 -1
- package/dist/types/auth.d.ts +37 -1
- package/dist/types/collections.d.ts +44 -6
- package/dist/types/datasource.d.ts +21 -14
- package/dist/types/entities.d.ts +5 -1
- package/dist/types/entity_actions.d.ts +14 -0
- package/dist/types/entity_callbacks.d.ts +2 -2
- package/dist/types/entity_overrides.d.ts +6 -0
- package/dist/types/fields.d.ts +31 -30
- package/dist/types/index.d.ts +2 -1
- package/dist/types/navigation.d.ts +15 -14
- package/dist/types/permissions.d.ts +5 -1
- package/dist/types/plugins.d.ts +22 -22
- package/dist/types/properties.d.ts +13 -5
- package/dist/types/property_config.d.ts +2 -2
- package/dist/types/roles.d.ts +31 -0
- package/dist/types/storage.d.ts +11 -3
- package/dist/types/user.d.ts +5 -0
- package/dist/util/collections.d.ts +9 -1
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +8 -2
- package/dist/util/navigation_utils.d.ts +2 -2
- package/dist/util/objects.d.ts +1 -1
- package/dist/util/permissions.d.ts +4 -4
- package/dist/util/references.d.ts +4 -2
- package/dist/util/resolutions.d.ts +14 -14
- package/dist/util/storage.d.ts +23 -2
- package/dist/util/useStorageUploadController.d.ts +1 -1
- package/dist/util/useTraceUpdate.d.ts +1 -0
- package/package.json +139 -119
- package/src/app/AppBar.tsx +18 -0
- package/src/app/Drawer.tsx +25 -0
- package/src/app/Scaffold.tsx +249 -0
- package/src/app/index.ts +4 -0
- package/src/app/useApp.tsx +32 -0
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/DeleteEntityDialog.tsx +4 -4
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +4 -4
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +276 -279
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +9 -5
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +48 -45
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +18 -17
- package/src/components/EntityCollectionTable/fields/TableStorageUpload.tsx +5 -5
- package/src/components/EntityCollectionTable/internal/CollectionTableToolbar.tsx +29 -34
- package/src/components/EntityCollectionTable/internal/EntityTableCell.tsx +16 -12
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +73 -72
- package/src/components/EntityCollectionView/EntityCollectionViewActions.tsx +5 -6
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +30 -0
- package/src/components/EntityPreview.tsx +209 -70
- package/src/components/EntityView.tsx +84 -0
- package/src/components/FieldCaption.tsx +14 -0
- package/src/components/HomePage/DefaultHomePage.tsx +15 -11
- package/src/components/HomePage/NavigationCard.tsx +69 -0
- package/src/components/HomePage/NavigationCardBinding.tsx +116 -0
- package/src/components/HomePage/SmallNavigationCard.tsx +45 -0
- package/src/components/HomePage/index.tsx +3 -1
- package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +4 -4
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +5 -5
- package/src/components/SelectableTable/SelectableTable.tsx +5 -3
- package/src/components/SelectableTable/filters/BooleanFilterField.tsx +2 -3
- package/src/components/SelectableTable/filters/DateTimeFilterField.tsx +23 -8
- package/src/components/SelectableTable/filters/ReferenceFilterField.tsx +38 -24
- package/src/components/SelectableTable/filters/StringNumberFilterField.tsx +35 -15
- package/src/components/VirtualTable/VirtualTable.tsx +38 -29
- package/src/components/VirtualTable/VirtualTableHeader.tsx +4 -4
- package/src/components/VirtualTable/VirtualTableHeaderRow.tsx +2 -2
- package/src/components/VirtualTable/VirtualTableProps.tsx +7 -7
- package/src/components/VirtualTable/VirtualTableRow.tsx +4 -5
- package/src/components/VirtualTable/fields/VirtualTableDateField.tsx +1 -1
- package/src/components/VirtualTable/types.tsx +2 -3
- package/src/components/{EntityCollectionTable/internal → common}/default_entity_actions.tsx +11 -7
- 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 +10 -2
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +12 -1
- package/src/components/common/useTableSearchHelper.ts +39 -9
- package/src/components/index.tsx +6 -3
- package/src/contexts/AuthControllerContext.tsx +1 -1
- package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +51 -34
- package/src/core/DefaultDrawer.tsx +177 -0
- package/src/core/DrawerNavigationItem.tsx +62 -0
- package/src/core/EntityEditView.tsx +1101 -0
- package/src/core/EntitySidePanel.tsx +3 -4
- package/src/core/FireCMS.tsx +54 -43
- package/src/core/NavigationRoutes.tsx +14 -7
- package/src/core/field_configs.tsx +2 -3
- package/src/core/index.tsx +3 -4
- package/src/form/PropertiesForm.tsx +81 -0
- package/src/form/PropertyFieldBinding.tsx +29 -7
- package/src/form/components/FieldHelperText.tsx +3 -3
- package/src/form/components/StorageItemPreview.tsx +5 -7
- package/src/form/components/StorageUploadProgress.tsx +9 -8
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +10 -12
- package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
- package/src/form/field_bindings/DateTimeFieldBinding.tsx +1 -1
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +19 -19
- package/src/form/field_bindings/MapFieldBinding.tsx +25 -17
- package/src/form/field_bindings/MarkdownFieldBinding.tsx +2 -2
- package/src/form/field_bindings/ReadOnlyFieldBinding.tsx +2 -9
- package/src/form/field_bindings/ReferenceFieldBinding.tsx +16 -13
- package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +14 -35
- package/src/form/field_bindings/TextFieldBinding.tsx +7 -5
- package/src/form/index.tsx +4 -4
- package/src/form/validation.ts +4 -21
- package/src/hooks/data/delete.ts +3 -3
- package/src/hooks/data/save.ts +4 -2
- package/src/hooks/data/useCollectionFetch.tsx +1 -1
- package/src/hooks/data/useDataSource.tsx +8 -3
- package/src/hooks/data/useEntityFetch.tsx +4 -4
- package/src/hooks/index.tsx +3 -0
- package/src/hooks/useBuildLocalConfigurationPersistence.tsx +8 -10
- package/src/hooks/useBuildModeController.tsx +11 -5
- package/src/hooks/useBuildNavigationController.tsx +200 -83
- package/src/hooks/useProjectLog.tsx +17 -7
- package/src/hooks/useReferenceDialog.tsx +2 -2
- package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
- package/src/hooks/useStorageSource.tsx +7 -2
- package/src/hooks/useValidateAuthenticator.tsx +115 -0
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +54 -47
- package/src/internal/useBuildSideEntityController.tsx +88 -21
- package/src/preview/PropertyPreview.tsx +5 -15
- package/src/preview/PropertyPreviewProps.tsx +1 -11
- package/src/preview/components/BooleanPreview.tsx +19 -4
- package/src/preview/components/EnumValuesChip.tsx +2 -2
- package/src/preview/components/ReferencePreview.tsx +72 -165
- package/src/preview/property_previews/ArrayOfMapsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOfReferencesPreview.tsx +2 -1
- package/src/preview/property_previews/ArrayOfStorageComponentsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOfStringsPreview.tsx +0 -1
- package/src/preview/property_previews/ArrayOneOfPreview.tsx +2 -3
- package/src/preview/property_previews/ArrayPropertyPreview.tsx +2 -3
- package/src/preview/property_previews/MapPropertyPreview.tsx +5 -5
- package/src/preview/property_previews/StringPropertyPreview.tsx +8 -7
- package/src/types/analytics.ts +1 -0
- package/src/types/auth.tsx +50 -1
- package/src/types/collections.ts +51 -6
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +24 -17
- package/src/types/entities.ts +9 -1
- package/src/types/entity_actions.tsx +17 -0
- package/src/types/entity_callbacks.ts +2 -2
- package/src/types/entity_overrides.tsx +7 -0
- package/src/types/fields.tsx +33 -33
- package/src/types/firecms.tsx +0 -1
- package/src/types/index.ts +2 -1
- package/src/types/navigation.ts +17 -17
- package/src/types/permissions.ts +6 -1
- package/src/types/plugins.tsx +28 -30
- package/src/types/properties.ts +19 -7
- package/src/types/property_config.tsx +2 -2
- package/src/types/roles.ts +41 -0
- package/src/types/side_entity_controller.tsx +1 -0
- package/src/types/storage.ts +12 -3
- package/src/types/user.ts +7 -0
- package/src/util/collections.ts +22 -0
- package/src/util/entities.ts +2 -1
- package/src/util/enums.ts +1 -1
- package/src/util/icon_list.ts +2 -2
- package/src/util/icon_synonyms.ts +3 -99
- package/src/util/icons.tsx +11 -3
- package/src/util/navigation_utils.ts +6 -6
- package/src/util/objects.ts +8 -21
- package/src/util/permissions.ts +12 -8
- package/src/util/references.ts +36 -5
- package/src/util/resolutions.ts +32 -31
- package/src/util/storage.ts +75 -21
- package/src/util/strings.ts +2 -2
- package/src/util/useStorageUploadController.tsx +21 -3
- package/src/util/useTraceUpdate.tsx +2 -1
- package/dist/components/VirtualTable/common.d.ts +0 -2
- package/dist/core/Drawer.d.ts +0 -23
- package/dist/core/EntityView.d.ts +0 -22
- 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/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/HomePage/NavigationCollectionCard.tsx +0 -146
- package/src/core/Drawer.tsx +0 -164
- package/src/core/EntityView.tsx +0 -578
- package/src/core/Scaffold.tsx +0 -281
- package/src/core/SideEntityView.tsx +0 -38
- package/src/form/EntityForm.tsx +0 -720
- package/src/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
|
@@ -0,0 +1,249 @@
|
|
|
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
|
+
* @constructor
|
|
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
|
+
return (
|
|
83
|
+
<AppContext.Provider value={{
|
|
84
|
+
logo,
|
|
85
|
+
hasDrawer: includeDrawer,
|
|
86
|
+
drawerHovered: onHover,
|
|
87
|
+
drawerOpen: computedDrawerOpen,
|
|
88
|
+
closeDrawer: handleDrawerClose,
|
|
89
|
+
openDrawer: handleDrawerOpen,
|
|
90
|
+
autoOpenDrawer
|
|
91
|
+
}}>
|
|
92
|
+
<div
|
|
93
|
+
className={cls("flex h-screen w-screen bg-gray-50 dark:bg-gray-900 text-gray-900 dark:text-white overflow-hidden", className)}
|
|
94
|
+
style={{
|
|
95
|
+
paddingTop: "env(safe-area-inset-top)",
|
|
96
|
+
paddingLeft: "env(safe-area-inset-left)",
|
|
97
|
+
paddingRight: "env(safe-area-inset-right)",
|
|
98
|
+
paddingBottom: "env(safe-area-inset-bottom)",
|
|
99
|
+
height: "100dvh",
|
|
100
|
+
...style
|
|
101
|
+
}}>
|
|
102
|
+
|
|
103
|
+
{appBarChildren}
|
|
104
|
+
|
|
105
|
+
<DrawerWrapper
|
|
106
|
+
displayed={includeDrawer}
|
|
107
|
+
onMouseEnter={setOnHoverTrue}
|
|
108
|
+
onMouseMove={setOnHoverTrue}
|
|
109
|
+
onMouseLeave={setOnHoverFalse}
|
|
110
|
+
open={computedDrawerOpen}
|
|
111
|
+
hovered={onHover}
|
|
112
|
+
setDrawerOpen={setDrawerOpen}>
|
|
113
|
+
{includeDrawer && drawerChildren}
|
|
114
|
+
</DrawerWrapper>
|
|
115
|
+
|
|
116
|
+
<main
|
|
117
|
+
className="flex flex-col flex-grow overflow-auto">
|
|
118
|
+
<DrawerHeader/>
|
|
119
|
+
<div
|
|
120
|
+
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")}>
|
|
121
|
+
|
|
122
|
+
<ErrorBoundary>
|
|
123
|
+
{otherChildren}
|
|
124
|
+
</ErrorBoundary>
|
|
125
|
+
|
|
126
|
+
</div>
|
|
127
|
+
</main>
|
|
128
|
+
</div>
|
|
129
|
+
</AppContext.Provider>
|
|
130
|
+
);
|
|
131
|
+
},
|
|
132
|
+
equal
|
|
133
|
+
)
|
|
134
|
+
|
|
135
|
+
const DrawerHeader = () => {
|
|
136
|
+
return (
|
|
137
|
+
<div className="flex flex-col min-h-[68px]"></div>
|
|
138
|
+
);
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
function DrawerWrapper(props: {
|
|
142
|
+
children: React.ReactNode,
|
|
143
|
+
displayed: boolean,
|
|
144
|
+
open: boolean,
|
|
145
|
+
logo?: string,
|
|
146
|
+
hovered: boolean,
|
|
147
|
+
setDrawerOpen: (open: boolean) => void,
|
|
148
|
+
onMouseEnter: () => void,
|
|
149
|
+
onMouseMove: () => void,
|
|
150
|
+
onMouseLeave: () => void
|
|
151
|
+
}) {
|
|
152
|
+
|
|
153
|
+
const width = !props.displayed ? 0 : (props.open ? DRAWER_WIDTH : 72);
|
|
154
|
+
const innerDrawer = <div
|
|
155
|
+
className={"relative h-full no-scrollbar overflow-y-auto overflow-x-hidden"}
|
|
156
|
+
style={{
|
|
157
|
+
width,
|
|
158
|
+
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"
|
|
159
|
+
}}
|
|
160
|
+
>
|
|
161
|
+
|
|
162
|
+
{!props.open && props.displayed && (
|
|
163
|
+
<Tooltip title="Open menu"
|
|
164
|
+
side="right"
|
|
165
|
+
sideOffset={12}
|
|
166
|
+
className="fixed top-2 left-3 !bg-gray-50 dark:!bg-gray-900 rounded-full w-fit z-20"
|
|
167
|
+
>
|
|
168
|
+
<IconButton
|
|
169
|
+
color="inherit"
|
|
170
|
+
aria-label="Open menu"
|
|
171
|
+
className="sticky top-2 left-3 "
|
|
172
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
173
|
+
size="large"
|
|
174
|
+
>
|
|
175
|
+
<MenuIcon/>
|
|
176
|
+
</IconButton>
|
|
177
|
+
</Tooltip>
|
|
178
|
+
)}
|
|
179
|
+
|
|
180
|
+
<div
|
|
181
|
+
className={`z-20 absolute right-0 top-4 ${
|
|
182
|
+
props.open ? "opacity-100" : "opacity-0 invisible"
|
|
183
|
+
} transition-opacity duration-200 ease-in-out`}>
|
|
184
|
+
<IconButton
|
|
185
|
+
aria-label="Close drawer"
|
|
186
|
+
onClick={() => props.setDrawerOpen(false)}
|
|
187
|
+
>
|
|
188
|
+
<ChevronLeftIcon/>
|
|
189
|
+
</IconButton>
|
|
190
|
+
</div>
|
|
191
|
+
|
|
192
|
+
<div className={"flex flex-col h-full"}>
|
|
193
|
+
{props.children}
|
|
194
|
+
</div>
|
|
195
|
+
|
|
196
|
+
</div>;
|
|
197
|
+
|
|
198
|
+
const largeLayout = useLargeLayout();
|
|
199
|
+
if (!largeLayout) {
|
|
200
|
+
if (!props.displayed)
|
|
201
|
+
return null;
|
|
202
|
+
return <>
|
|
203
|
+
<IconButton
|
|
204
|
+
color="inherit"
|
|
205
|
+
aria-label="Open drawer"
|
|
206
|
+
onClick={() => props.setDrawerOpen(true)}
|
|
207
|
+
size="large"
|
|
208
|
+
className="absolute top-2 left-6"
|
|
209
|
+
>
|
|
210
|
+
<MenuIcon/>
|
|
211
|
+
</IconButton>
|
|
212
|
+
<Sheet side={"left"}
|
|
213
|
+
transparent={true}
|
|
214
|
+
open={props.open}
|
|
215
|
+
onOpenChange={props.setDrawerOpen}
|
|
216
|
+
>
|
|
217
|
+
{innerDrawer}
|
|
218
|
+
</Sheet>
|
|
219
|
+
</>;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
return (
|
|
223
|
+
<div
|
|
224
|
+
className="z-20 relative"
|
|
225
|
+
onMouseEnter={props.onMouseEnter}
|
|
226
|
+
onMouseMove={props.onMouseMove}
|
|
227
|
+
onMouseLeave={props.onMouseLeave}
|
|
228
|
+
style={{
|
|
229
|
+
width,
|
|
230
|
+
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"
|
|
231
|
+
}}>
|
|
232
|
+
|
|
233
|
+
{innerDrawer}
|
|
234
|
+
|
|
235
|
+
{/*<div*/}
|
|
236
|
+
{/* className={`z-20 absolute right-0 top-4 ${*/}
|
|
237
|
+
{/* props.open ? "opacity-100" : "opacity-0 invisible"*/}
|
|
238
|
+
{/* } transition-opacity duration-1000 ease-in-out`}>*/}
|
|
239
|
+
{/* <IconButton*/}
|
|
240
|
+
{/* aria-label="Close drawer"*/}
|
|
241
|
+
{/* onClick={() => props.setDrawerOpen(false)}*/}
|
|
242
|
+
{/* >*/}
|
|
243
|
+
{/* <ChevronLeftIcon/>*/}
|
|
244
|
+
{/* </IconButton>*/}
|
|
245
|
+
{/*</div>*/}
|
|
246
|
+
|
|
247
|
+
</div>
|
|
248
|
+
);
|
|
249
|
+
}
|
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
|
+
}
|
|
@@ -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
|
+
}
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
useSnackbarController
|
|
10
10
|
} from "../hooks";
|
|
11
11
|
import { resolveCollection } from "../util";
|
|
12
|
-
import {
|
|
12
|
+
import { EntityView } from "./EntityView";
|
|
13
13
|
|
|
14
14
|
export interface DeleteEntityDialogProps<M extends Record<string, any>> {
|
|
15
15
|
entityOrEntitiesToDelete?: Entity<M> | Entity<M>[],
|
|
@@ -35,7 +35,7 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
35
35
|
path
|
|
36
36
|
}: DeleteEntityDialogProps<M>) {
|
|
37
37
|
|
|
38
|
-
const dataSource = useDataSource();
|
|
38
|
+
const dataSource = useDataSource(collection);
|
|
39
39
|
const customizationController = useCustomizationController();
|
|
40
40
|
const snackbarController = useSnackbarController();
|
|
41
41
|
const [loading, setLoading] = useState(false);
|
|
@@ -163,7 +163,7 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
163
163
|
} else {
|
|
164
164
|
const entity = entityOrEntities as Entity<M> | undefined;
|
|
165
165
|
content = entity
|
|
166
|
-
? <
|
|
166
|
+
? <EntityView
|
|
167
167
|
entity={entity}
|
|
168
168
|
collection={collection}
|
|
169
169
|
path={path}/>
|
|
@@ -176,7 +176,7 @@ export function DeleteEntityDialog<M extends Record<string, any>>({
|
|
|
176
176
|
|
|
177
177
|
return (
|
|
178
178
|
<Dialog
|
|
179
|
-
maxWidth={"2xl"}
|
|
179
|
+
maxWidth={multipleEntities ? "lg" : "2xl"}
|
|
180
180
|
aria-labelledby="delete-dialog"
|
|
181
181
|
open={open}
|
|
182
182
|
onOpenChange={(open) => !open ? onClose() : undefined}
|
|
@@ -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, Typography } from "@firecms/ui";
|
|
5
5
|
import { useFireCMSContext, useLargeLayout } from "../../hooks";
|
|
6
6
|
|
|
7
7
|
/**
|
|
@@ -72,7 +72,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
72
72
|
return (
|
|
73
73
|
<div
|
|
74
74
|
onClick={onClick}
|
|
75
|
-
className={
|
|
75
|
+
className={cls(
|
|
76
76
|
"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
77
|
frozen ? "sticky left-0" : ""
|
|
78
78
|
)}
|
|
@@ -99,7 +99,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
99
99
|
selectionController,
|
|
100
100
|
highlightEntity,
|
|
101
101
|
unhighlightEntity,
|
|
102
|
-
onCollectionChange
|
|
102
|
+
onCollectionChange,
|
|
103
103
|
});
|
|
104
104
|
}}
|
|
105
105
|
size={largeLayout ? "medium" : "small"}>
|
|
@@ -127,7 +127,7 @@ export const EntityCollectionRowActions = function EntityCollectionRowActions({
|
|
|
127
127
|
selectionController,
|
|
128
128
|
highlightEntity,
|
|
129
129
|
unhighlightEntity,
|
|
130
|
-
onCollectionChange
|
|
130
|
+
onCollectionChange,
|
|
131
131
|
});
|
|
132
132
|
}}>
|
|
133
133
|
{action.icon}
|