@firecms/core 3.0.0-canary.9 → 3.0.0-canary.90
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/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 +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 -2
- package/dist/components/EntityCollectionView/EntityCollectionViewStartActions.d.ts +11 -0
- package/dist/components/EntityPreview.d.ts +5 -4
- 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/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/useDataSourceEntityCollectionTableController.d.ts +3 -0
- package/dist/components/index.d.ts +2 -1
- package/dist/contexts/AuthControllerContext.d.ts +1 -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 +9 -0
- package/dist/core/EntityEditView.d.ts +17 -3
- 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/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 +4 -4
- package/dist/form/field_bindings/MapFieldBinding.d.ts +1 -1
- package/dist/form/field_bindings/StorageUploadFieldBinding.d.ts +2 -4
- package/dist/form/index.d.ts +0 -2
- 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 +1 -1
- package/dist/hooks/data/useEntityFetch.d.ts +3 -3
- package/dist/hooks/index.d.ts +2 -0
- package/dist/hooks/useBuildNavigationController.d.ts +1 -2
- package/dist/hooks/useProjectLog.d.ts +2 -2
- package/dist/hooks/useValidateAuthenticator.d.ts +21 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +15552 -11933
- package/dist/index.es.js.map +1 -1
- package/dist/index.umd.js +19643 -7
- package/dist/index.umd.js.map +1 -1
- package/dist/internal/useBuildDataSource.d.ts +1 -16
- package/dist/internal/useRestoreScroll.d.ts +1 -1
- package/dist/preview/PropertyPreviewProps.d.ts +6 -4
- package/dist/preview/components/ReferencePreview.d.ts +2 -1
- package/dist/preview/components/StorageThumbnail.d.ts +2 -1
- package/dist/preview/components/UrlComponentPreview.d.ts +2 -1
- package/dist/types/auth.d.ts +26 -2
- package/dist/types/collections.d.ts +31 -7
- package/dist/types/datasource.d.ts +34 -20
- 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/fields.d.ts +31 -30
- package/dist/types/index.d.ts +0 -1
- package/dist/types/navigation.d.ts +5 -5
- package/dist/types/plugins.d.ts +16 -6
- package/dist/types/properties.d.ts +17 -4
- package/dist/types/storage.d.ts +11 -3
- package/dist/util/collections.d.ts +1 -1
- package/dist/util/entities.d.ts +1 -1
- package/dist/util/icon_synonyms.d.ts +1 -97
- package/dist/util/icons.d.ts +2 -2
- 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/resolutions.d.ts +13 -13
- 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 +130 -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/CircularProgressCenter.tsx +1 -1
- package/src/components/ClearFilterSortButton.tsx +41 -0
- package/src/components/EntityCollectionTable/EntityCollectionRowActions.tsx +9 -18
- package/src/components/EntityCollectionTable/EntityCollectionTable.tsx +21 -20
- package/src/components/EntityCollectionTable/EntityCollectionTableProps.tsx +10 -6
- package/src/components/EntityCollectionTable/PropertyTableCell.tsx +38 -34
- package/src/components/EntityCollectionTable/column_utils.tsx +3 -3
- package/src/components/EntityCollectionTable/fields/TableReferenceField.tsx +11 -2
- 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 +16 -12
- package/src/components/EntityCollectionTable/internal/popup_field/PopupFormField.tsx +4 -5
- package/src/components/EntityCollectionView/EntityCollectionView.tsx +69 -45
- package/src/components/EntityCollectionView/EntityCollectionViewStartActions.tsx +68 -0
- package/src/components/EntityCollectionView/useSelectionController.tsx +19 -7
- package/src/components/EntityPreview.tsx +15 -9
- package/src/components/EntityView.tsx +5 -5
- package/src/components/ErrorView.tsx +1 -1
- package/src/components/HomePage/DefaultHomePage.tsx +3 -3
- package/src/components/HomePage/NavigationCard.tsx +3 -3
- package/src/components/HomePage/NavigationCardBinding.tsx +1 -1
- package/src/components/HomePage/SmallNavigationCard.tsx +5 -5
- package/src/components/PropertyIdCopyTooltipContent.tsx +2 -3
- package/src/components/ReferenceTable/ReferenceSelectionTable.tsx +1 -0
- package/src/components/ReferenceWidget.tsx +22 -12
- package/src/components/SearchIconsView.tsx +5 -5
- 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 +1 -1
- 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 +10 -2
- package/src/components/common/useDataSourceEntityCollectionTableController.tsx +11 -0
- package/src/components/common/useTableSearchHelper.ts +52 -12
- package/src/components/index.tsx +2 -1
- package/src/contexts/AuthControllerContext.tsx +1 -1
- package/src/contexts/DialogsProvider.tsx +2 -2
- package/src/{components/FireCMSAppBar.tsx → core/DefaultAppBar.tsx} +52 -37
- package/src/core/DefaultDrawer.tsx +177 -0
- package/src/core/DrawerNavigationItem.tsx +62 -0
- package/src/core/EntityEditView.tsx +676 -133
- package/src/core/EntitySidePanel.tsx +1 -2
- package/src/core/FireCMS.tsx +39 -44
- package/src/core/NavigationRoutes.tsx +7 -8
- 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 +20 -11
- package/src/form/components/StorageUploadProgress.tsx +3 -3
- package/src/form/field_bindings/ArrayCustomShapedFieldBinding.tsx +8 -5
- package/src/form/field_bindings/ArrayOfReferencesFieldBinding.tsx +8 -5
- package/src/form/field_bindings/BlockFieldBinding.tsx +2 -2
- package/src/form/field_bindings/KeyValueFieldBinding.tsx +44 -39
- package/src/form/field_bindings/MapFieldBinding.tsx +11 -3
- 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 +15 -13
- package/src/form/field_bindings/RepeatFieldBinding.tsx +10 -7
- package/src/form/field_bindings/SelectFieldBinding.tsx +3 -3
- package/src/form/field_bindings/StorageUploadFieldBinding.tsx +22 -43
- package/src/form/field_bindings/SwitchFieldBinding.tsx +1 -1
- package/src/form/index.tsx +4 -4
- package/src/form/validation.ts +1 -17
- package/src/hooks/data/delete.ts +3 -3
- package/src/hooks/data/save.ts +4 -2
- package/src/hooks/data/useDataSource.tsx +2 -2
- package/src/hooks/data/useEntityFetch.tsx +3 -3
- 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 +137 -61
- package/src/hooks/useProjectLog.tsx +21 -8
- package/src/hooks/useResolvedNavigationFrom.tsx +1 -1
- package/src/hooks/useValidateAuthenticator.tsx +115 -0
- package/src/index.ts +1 -0
- package/src/internal/useBuildDataSource.ts +56 -49
- package/src/internal/useBuildSideEntityController.tsx +88 -21
- package/src/preview/PropertyPreview.tsx +9 -16
- package/src/preview/PropertyPreviewProps.tsx +4 -8
- package/src/preview/components/BooleanPreview.tsx +4 -2
- package/src/preview/components/EnumValuesChip.tsx +1 -1
- package/src/preview/components/ImagePreview.tsx +21 -33
- package/src/preview/components/ReferencePreview.tsx +23 -23
- package/src/preview/components/StorageThumbnail.tsx +5 -1
- package/src/preview/components/UrlComponentPreview.tsx +44 -11
- 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 +2 -2
- package/src/types/auth.tsx +35 -2
- package/src/types/collections.ts +37 -8
- package/src/types/customization_controller.tsx +0 -1
- package/src/types/datasource.ts +41 -24
- package/src/types/entities.ts +9 -1
- package/src/types/entity_actions.tsx +16 -3
- package/src/types/entity_callbacks.ts +2 -2
- package/src/types/fields.tsx +33 -33
- package/src/types/index.ts +0 -1
- package/src/types/navigation.ts +6 -7
- package/src/types/plugins.tsx +18 -8
- package/src/types/properties.ts +22 -6
- package/src/types/storage.ts +12 -3
- package/src/util/collections.ts +1 -1
- package/src/util/entities.ts +5 -4
- 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/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/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/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/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/internal/useBuildCustomizationController.tsx +0 -5
- package/src/internal/useLocaleConfig.tsx +0 -18
- package/src/types/appcheck.ts +0 -29
|
@@ -5,14 +5,13 @@ import {
|
|
|
5
5
|
OnVirtualTableColumnResizeParams,
|
|
6
6
|
VirtualTableColumn,
|
|
7
7
|
VirtualTableFilterValues,
|
|
8
|
-
VirtualTableSize,
|
|
9
8
|
VirtualTableWhereFilterOp
|
|
10
9
|
} from "./VirtualTableProps";
|
|
11
10
|
import { FilterFormFieldProps } from "./VirtualTableHeader";
|
|
12
11
|
|
|
13
12
|
export type VirtualTableRowProps<T> = {
|
|
14
13
|
style: any,
|
|
15
|
-
|
|
14
|
+
rowHeight: number,
|
|
16
15
|
rowData: T;
|
|
17
16
|
rowIndex: number;
|
|
18
17
|
onRowClick?: (props: OnRowClickParams<any>) => void;
|
|
@@ -24,7 +23,7 @@ export type VirtualTableRowProps<T> = {
|
|
|
24
23
|
|
|
25
24
|
export type VirtualTableContextProps<T extends any> = {
|
|
26
25
|
data?: T[];
|
|
27
|
-
|
|
26
|
+
rowHeight?: number,
|
|
28
27
|
columns: VirtualTableColumn[];
|
|
29
28
|
cellRenderer: React.ComponentType<CellRendererParams<T>>;
|
|
30
29
|
currentSort: "asc" | "desc" | undefined;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { EntityAction } from "../../../types";
|
|
2
1
|
import { ArchiveIcon, DeleteIcon, FileCopyIcon, KeyboardTabIcon, OpenInNewIcon } from "@firecms/ui";
|
|
3
|
-
import {
|
|
2
|
+
import { EntityAction } from "../../types";
|
|
3
|
+
import { DeleteEntityDialog } from "../DeleteEntityDialog";
|
|
4
4
|
|
|
5
5
|
export const editEntityAction: EntityAction = {
|
|
6
6
|
icon: <KeyboardTabIcon/>,
|
|
@@ -1,6 +1,9 @@
|
|
|
1
|
-
|
|
1
|
+
/**
|
|
2
|
+
* @group Components
|
|
3
|
+
*/
|
|
4
|
+
export type TableSize = "xs" | "s" | "m" | "l" | "xl";
|
|
2
5
|
|
|
3
|
-
export function getRowHeight(size:
|
|
6
|
+
export function getRowHeight(size: TableSize): number {
|
|
4
7
|
switch (size) {
|
|
5
8
|
case "xl":
|
|
6
9
|
return 400;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { CollectionSize,
|
|
1
|
+
import { CollectionSize, ResolvedProperty, SelectedCellProps } from "../../types";
|
|
2
2
|
|
|
3
3
|
export type EntityCollectionTableController<M extends Record<string, any>> = {
|
|
4
4
|
|
|
@@ -31,14 +31,12 @@ export type EntityCollectionTableController<M extends Record<string, any>> = {
|
|
|
31
31
|
* Props passed in a callback when the content of a cell in a table has been edited
|
|
32
32
|
* @group Collection components
|
|
33
33
|
*/
|
|
34
|
-
export interface OnCellValueChangeParams<T = any,
|
|
34
|
+
export interface OnCellValueChangeParams<T = any, D = any> {
|
|
35
35
|
value: T,
|
|
36
36
|
propertyKey: string,
|
|
37
|
-
|
|
37
|
+
data?: D,
|
|
38
38
|
onValueUpdated: () => void
|
|
39
|
-
setError: (e: Error) => void
|
|
40
|
-
fullPath: string
|
|
41
|
-
context: FireCMSContext
|
|
39
|
+
setError: (e: Error | undefined) => void
|
|
42
40
|
}
|
|
43
41
|
|
|
44
42
|
/**
|
|
@@ -7,8 +7,16 @@ const COLLECTION_GROUP_PARENT_ID = "collectionGroupParent";
|
|
|
7
7
|
|
|
8
8
|
export function useColumnIds<M extends Record<string, any>>(collection: ResolvedEntityCollection<M>, includeSubcollections: boolean): PropertyColumnConfig[] {
|
|
9
9
|
return useMemo(() => {
|
|
10
|
-
if (collection.propertiesOrder)
|
|
11
|
-
|
|
10
|
+
if (collection.propertiesOrder) {
|
|
11
|
+
const propertyColumnConfigs = hideAndExpandKeys(collection, collection.propertiesOrder);
|
|
12
|
+
if (collection.collectionGroup) {
|
|
13
|
+
propertyColumnConfigs.push({
|
|
14
|
+
key: COLLECTION_GROUP_PARENT_ID,
|
|
15
|
+
disabled: true
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
return propertyColumnConfigs;
|
|
19
|
+
}
|
|
12
20
|
return getDefaultColumnKeys(collection, includeSubcollections);
|
|
13
21
|
}, [collection, includeSubcollections]);
|
|
14
22
|
}
|
|
@@ -12,6 +12,7 @@ import {
|
|
|
12
12
|
User
|
|
13
13
|
} from "../../types";
|
|
14
14
|
import { useDebouncedData } from "./useDebouncedData";
|
|
15
|
+
import equal from "react-fast-compare"
|
|
15
16
|
|
|
16
17
|
const DEFAULT_PAGE_SIZE = 50;
|
|
17
18
|
|
|
@@ -31,6 +32,10 @@ export type DataSourceEntityCollectionTableControllerProps<M extends Record<stri
|
|
|
31
32
|
entitiesDisplayedFirst?: Entity<M>[];
|
|
32
33
|
|
|
33
34
|
lastDeleteTimestamp?: number;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Force filter to be applied to the table.
|
|
38
|
+
*/
|
|
34
39
|
forceFilter?: FilterValues<string>;
|
|
35
40
|
}
|
|
36
41
|
|
|
@@ -83,6 +88,12 @@ export function useDataSourceEntityCollectionTableController<M extends Record<st
|
|
|
83
88
|
return initialSort;
|
|
84
89
|
}, [initialSort, forceFilter]);
|
|
85
90
|
|
|
91
|
+
useEffect(() => {
|
|
92
|
+
if (!equal(forceFilter, filterValues)) {
|
|
93
|
+
setFilterValues(forceFilter)
|
|
94
|
+
}
|
|
95
|
+
}, [forceFilter]);
|
|
96
|
+
|
|
86
97
|
const [filterValues, setFilterValues] = React.useState<FilterValues<Extract<keyof M, string>> | undefined>(forceFilter ?? initialFilter ?? undefined);
|
|
87
98
|
const [sortBy, setSortBy] = React.useState<[Extract<keyof M, string>, "asc" | "desc"] | undefined>(initialSortInternal);
|
|
88
99
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { useState } from "react";
|
|
2
2
|
|
|
3
3
|
import { EntityCollection } from "../../types";
|
|
4
|
-
import { useCustomizationController, useFireCMSContext } from "../../hooks";
|
|
4
|
+
import { useCustomizationController, useDataSource, useFireCMSContext } from "../../hooks";
|
|
5
5
|
|
|
6
6
|
export interface UseTableSearchHelperParams<M extends Record<string, any>> {
|
|
7
7
|
collection: EntityCollection<M>;
|
|
@@ -9,27 +9,57 @@ export interface UseTableSearchHelperParams<M extends Record<string, any>> {
|
|
|
9
9
|
parentCollectionIds?: string[];
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
export function useTableSearchHelper<M extends Record<string, any>>({
|
|
12
|
+
export function useTableSearchHelper<M extends Record<string, any>>({
|
|
13
|
+
collection,
|
|
14
|
+
fullPath,
|
|
15
|
+
parentCollectionIds
|
|
16
|
+
}: UseTableSearchHelperParams<M>) {
|
|
13
17
|
|
|
14
18
|
const context = useFireCMSContext();
|
|
15
19
|
const customizationController = useCustomizationController();
|
|
20
|
+
const dataSource = useDataSource();
|
|
16
21
|
|
|
17
22
|
const [textSearchLoading, setTextSearchLoading] = useState<boolean>(false);
|
|
18
23
|
const [textSearchInitialised, setTextSearchInitialised] = useState<boolean>(false);
|
|
24
|
+
|
|
19
25
|
let onTextSearchClick: (() => void) | undefined;
|
|
20
26
|
let textSearchEnabled = Boolean(collection.textSearchEnabled);
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
|
|
28
|
+
const props = {
|
|
29
|
+
context,
|
|
30
|
+
path: fullPath,
|
|
31
|
+
collection,
|
|
32
|
+
parentCollectionIds
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const searchBlocked = customizationController.plugins?.find(p => {
|
|
36
|
+
return p.collectionView?.blockSearch?.(props);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const addTextSearchClickListener = Boolean(dataSource?.initTextSearch) || customizationController.plugins?.find(p => Boolean(p.collectionView?.onTextSearchClick));
|
|
40
|
+
|
|
41
|
+
if (addTextSearchClickListener) {
|
|
23
42
|
|
|
24
43
|
onTextSearchClick = addTextSearchClickListener
|
|
25
44
|
? () => {
|
|
26
45
|
setTextSearchLoading(true);
|
|
27
|
-
Promise
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
.
|
|
46
|
+
const promises: Promise<boolean>[] = [];
|
|
47
|
+
if (dataSource?.initTextSearch && !searchBlocked) {
|
|
48
|
+
promises.push(dataSource.initTextSearch(props));
|
|
49
|
+
}
|
|
50
|
+
if (searchBlocked) {
|
|
51
|
+
customizationController.plugins?.forEach(p => {
|
|
52
|
+
if (p.collectionView?.onTextSearchClick)
|
|
53
|
+
promises.push(p.collectionView.onTextSearchClick({
|
|
54
|
+
context,
|
|
55
|
+
path: fullPath,
|
|
56
|
+
collection,
|
|
57
|
+
parentCollectionIds
|
|
58
|
+
}));
|
|
59
|
+
})
|
|
60
|
+
}
|
|
61
|
+
return Promise.all(promises)
|
|
62
|
+
.then((res: boolean[]) => {
|
|
33
63
|
if (res.every(Boolean)) setTextSearchInitialised(true);
|
|
34
64
|
})
|
|
35
65
|
.finally(() => setTextSearchLoading(false));
|
|
@@ -39,9 +69,19 @@ export function useTableSearchHelper<M extends Record<string, any>>({ collection
|
|
|
39
69
|
customizationController.plugins?.forEach(p => {
|
|
40
70
|
if (!textSearchEnabled)
|
|
41
71
|
if (p.collectionView?.showTextSearchBar) {
|
|
42
|
-
textSearchEnabled = p.collectionView.showTextSearchBar({
|
|
72
|
+
textSearchEnabled = p.collectionView.showTextSearchBar({
|
|
73
|
+
context,
|
|
74
|
+
path: fullPath,
|
|
75
|
+
collection,
|
|
76
|
+
parentCollectionIds
|
|
77
|
+
});
|
|
43
78
|
}
|
|
44
79
|
})
|
|
45
80
|
}
|
|
46
|
-
return {
|
|
81
|
+
return {
|
|
82
|
+
textSearchLoading,
|
|
83
|
+
textSearchInitialised,
|
|
84
|
+
onTextSearchClick,
|
|
85
|
+
textSearchEnabled
|
|
86
|
+
};
|
|
47
87
|
}
|
package/src/components/index.tsx
CHANGED
|
@@ -13,6 +13,7 @@ export * from "./common";
|
|
|
13
13
|
|
|
14
14
|
export * from "./HomePage";
|
|
15
15
|
export * from "./SelectableTable/SelectableTable";
|
|
16
|
+
export * from "./SelectableTable/SelectableTableContext";
|
|
16
17
|
export * from "./EntityCollectionView/EntityCollectionView";
|
|
17
18
|
export * from "./EntityCollectionView/EntityCollectionViewActions";
|
|
18
19
|
export * from "./EntityCollectionView/useSelectionController";
|
|
@@ -28,7 +29,7 @@ export * from "./DeleteConfirmationDialog";
|
|
|
28
29
|
|
|
29
30
|
export * from "./FireCMSLogo";
|
|
30
31
|
|
|
31
|
-
export * from "
|
|
32
|
+
export * from "../core/DefaultAppBar";
|
|
32
33
|
|
|
33
34
|
export * from "./ArrayContainer";
|
|
34
35
|
export * from "./ReferenceWidget";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
import { AuthController } from "../types";
|
|
3
3
|
|
|
4
|
-
export const AuthControllerContext = React.createContext<AuthController
|
|
4
|
+
export const AuthControllerContext = React.createContext<AuthController<any, any>>({} as AuthController<any, any>);
|
|
@@ -18,14 +18,14 @@ export const DialogsProvider: React.FC<PropsWithChildren<{}>> = ({ children }) =
|
|
|
18
18
|
if (dialogEntries.length === 0)
|
|
19
19
|
return;
|
|
20
20
|
|
|
21
|
-
const updatedPanels = [...
|
|
21
|
+
const updatedPanels = [...dialogEntriesRef.current.slice(0, -1)];
|
|
22
22
|
updateDialogEntries(updatedPanels);
|
|
23
23
|
|
|
24
24
|
}, [dialogEntries]);
|
|
25
25
|
|
|
26
26
|
const open = useCallback((dialogEntry: DialogControllerEntryProps) => {
|
|
27
27
|
|
|
28
|
-
const updatedPanels = [...
|
|
28
|
+
const updatedPanels = [...dialogEntriesRef.current, dialogEntry];
|
|
29
29
|
updateDialogEntries(updatedPanels);
|
|
30
30
|
|
|
31
31
|
return {
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import React from "react";
|
|
2
2
|
|
|
3
|
-
import { Link as ReactLink } from "react-router-dom";
|
|
4
|
-
import { ErrorBoundary } from "../components";
|
|
3
|
+
import { Link as ReactLink, useNavigate } from "react-router-dom";
|
|
4
|
+
import { ErrorBoundary, FireCMSLogo } from "../components";
|
|
5
5
|
import {
|
|
6
6
|
Avatar,
|
|
7
|
-
|
|
7
|
+
cls,
|
|
8
8
|
DarkModeIcon,
|
|
9
9
|
IconButton,
|
|
10
10
|
LightModeIcon,
|
|
@@ -16,9 +16,11 @@ import {
|
|
|
16
16
|
} from "@firecms/ui";
|
|
17
17
|
import { useAuthController, useLargeLayout, useModeController, useNavigationController } from "../hooks";
|
|
18
18
|
import { User } from "../types";
|
|
19
|
+
import { useApp } from "../app/useApp";
|
|
19
20
|
|
|
20
|
-
export type
|
|
21
|
-
|
|
21
|
+
export type DefaultAppBarProps<ADDITIONAL_PROPS = object> = {
|
|
22
|
+
|
|
23
|
+
title?: React.ReactNode;
|
|
22
24
|
/**
|
|
23
25
|
* A component that gets rendered on the upper side of the main toolbar
|
|
24
26
|
*/
|
|
@@ -28,14 +30,14 @@ export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
|
|
|
28
30
|
|
|
29
31
|
dropDownActions?: React.ReactNode;
|
|
30
32
|
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
drawerOpen: boolean;
|
|
33
|
+
includeModeToggle?: boolean;
|
|
34
34
|
|
|
35
35
|
className?: string;
|
|
36
36
|
|
|
37
37
|
style?: React.CSSProperties;
|
|
38
38
|
|
|
39
|
+
logo?: string;
|
|
40
|
+
|
|
39
41
|
user?: User;
|
|
40
42
|
} & ADDITIONAL_PROPS;
|
|
41
43
|
|
|
@@ -43,22 +45,24 @@ export type FireCMSAppBarProps<ADDITIONAL_PROPS = object> = {
|
|
|
43
45
|
* This component renders the main app bar of FireCMS.
|
|
44
46
|
* You will likely not need to use this component directly.
|
|
45
47
|
*
|
|
46
|
-
|
|
47
|
-
* @param toolbarExtraWidget
|
|
48
|
-
* @param drawerOpen
|
|
49
|
-
* @constructor
|
|
48
|
+
|
|
50
49
|
*/
|
|
51
|
-
export const
|
|
50
|
+
export const DefaultAppBar = function DefaultAppBar({
|
|
52
51
|
title,
|
|
53
52
|
endAdornment,
|
|
54
53
|
startAdornment,
|
|
55
|
-
drawerOpen,
|
|
56
54
|
dropDownActions,
|
|
57
|
-
|
|
55
|
+
includeModeToggle = true,
|
|
58
56
|
className,
|
|
59
57
|
style,
|
|
60
58
|
user: userProp
|
|
61
|
-
}:
|
|
59
|
+
}: DefaultAppBarProps) {
|
|
60
|
+
|
|
61
|
+
const {
|
|
62
|
+
hasDrawer,
|
|
63
|
+
drawerOpen,
|
|
64
|
+
logo
|
|
65
|
+
} = useApp();
|
|
62
66
|
const navigation = useNavigationController();
|
|
63
67
|
|
|
64
68
|
const authController = useAuthController();
|
|
@@ -67,6 +71,8 @@ export const FireCMSAppBar = function FireCMSAppBar({
|
|
|
67
71
|
toggleMode
|
|
68
72
|
} = useModeController();
|
|
69
73
|
|
|
74
|
+
const navigate = useNavigate();
|
|
75
|
+
|
|
70
76
|
const largeLayout = useLargeLayout();
|
|
71
77
|
|
|
72
78
|
const user = userProp ?? authController.user;
|
|
@@ -89,40 +95,45 @@ export const FireCMSAppBar = function FireCMSAppBar({
|
|
|
89
95
|
return (
|
|
90
96
|
<div
|
|
91
97
|
style={style}
|
|
92
|
-
className={
|
|
98
|
+
className={cls("w-full h-16 transition-all ease-in duration-75 fixed",
|
|
93
99
|
{
|
|
94
|
-
"
|
|
95
|
-
"
|
|
96
|
-
"h-16": true,
|
|
100
|
+
"pl-[17rem]": drawerOpen && largeLayout,
|
|
101
|
+
"pl-20": hasDrawer && !(drawerOpen && largeLayout),
|
|
97
102
|
"z-10": largeLayout,
|
|
98
|
-
"
|
|
99
|
-
"
|
|
100
|
-
"
|
|
101
|
-
"w-full": !includeDrawer,
|
|
102
|
-
"w-[calc(100%-64px)]": includeDrawer && !(drawerOpen && largeLayout),
|
|
103
|
-
"w-[calc(100%-17rem)]": includeDrawer && (drawerOpen && largeLayout),
|
|
103
|
+
// "w-full": !hasDrawer,
|
|
104
|
+
// "w-[calc(100%-64px)]": hasDrawer && !(drawerOpen && largeLayout),
|
|
105
|
+
// "w-[calc(100%-17rem)]": hasDrawer && (drawerOpen && largeLayout),
|
|
104
106
|
"duration-150": drawerOpen && largeLayout,
|
|
105
|
-
fixed: true,
|
|
106
107
|
},
|
|
107
108
|
className)}>
|
|
108
109
|
|
|
109
110
|
<div className="flex flex-row gap-2 px-4 h-full items-center">
|
|
110
111
|
|
|
111
|
-
{startAdornment}
|
|
112
|
-
|
|
113
112
|
{navigation && <div className="mr-8 hidden lg:block">
|
|
114
113
|
<ReactLink
|
|
115
114
|
className="visited:text-inherit visited:dark:text-inherit"
|
|
116
115
|
to={navigation?.basePath ?? "/"}
|
|
117
116
|
>
|
|
118
|
-
<
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
117
|
+
<div className={"flex flex-row gap-4"}>
|
|
118
|
+
{!hasDrawer && (logo
|
|
119
|
+
? <img src={logo}
|
|
120
|
+
alt="Logo"
|
|
121
|
+
className={cls("w-[32px] h-[32px] object-contain")}/>
|
|
122
|
+
: <FireCMSLogo width={"32px"} height={"32px"}/>)}
|
|
123
|
+
|
|
124
|
+
{typeof title === "string"
|
|
125
|
+
? <Typography variant="subtitle1"
|
|
126
|
+
noWrap
|
|
127
|
+
className={"ml-2 !font-medium"}>
|
|
128
|
+
{title}
|
|
129
|
+
</Typography>
|
|
130
|
+
: title}
|
|
131
|
+
</div>
|
|
123
132
|
</ReactLink>
|
|
124
133
|
</div>}
|
|
125
134
|
|
|
135
|
+
{startAdornment}
|
|
136
|
+
|
|
126
137
|
<div className={"flex-grow"}/>
|
|
127
138
|
|
|
128
139
|
{endAdornment &&
|
|
@@ -130,7 +141,7 @@ export const FireCMSAppBar = function FireCMSAppBar({
|
|
|
130
141
|
{endAdornment}
|
|
131
142
|
</ErrorBoundary>}
|
|
132
143
|
|
|
133
|
-
<IconButton
|
|
144
|
+
{includeModeToggle && <IconButton
|
|
134
145
|
color="inherit"
|
|
135
146
|
aria-label="Open drawer"
|
|
136
147
|
onClick={toggleMode}
|
|
@@ -138,7 +149,7 @@ export const FireCMSAppBar = function FireCMSAppBar({
|
|
|
138
149
|
{mode === "dark"
|
|
139
150
|
? <DarkModeIcon/>
|
|
140
151
|
: <LightModeIcon/>}
|
|
141
|
-
</IconButton>
|
|
152
|
+
</IconButton>}
|
|
142
153
|
|
|
143
154
|
<Menu trigger={avatarComponent}>
|
|
144
155
|
{user && <div className={"px-4 py-2 mb-2"}>
|
|
@@ -152,7 +163,11 @@ export const FireCMSAppBar = function FireCMSAppBar({
|
|
|
152
163
|
|
|
153
164
|
{dropDownActions}
|
|
154
165
|
|
|
155
|
-
{!dropDownActions && <MenuItem onClick={
|
|
166
|
+
{!dropDownActions && <MenuItem onClick={async () => {
|
|
167
|
+
await authController.signOut();
|
|
168
|
+
// replace current route with home
|
|
169
|
+
navigate("/");
|
|
170
|
+
}}>
|
|
156
171
|
<LogoutIcon/>
|
|
157
172
|
Log Out
|
|
158
173
|
</MenuItem>}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import React, { useCallback } from "react";
|
|
2
|
+
|
|
3
|
+
import { useLargeLayout, useNavigationController } from "../hooks";
|
|
4
|
+
|
|
5
|
+
import { Link, useNavigate } from "react-router-dom";
|
|
6
|
+
import { CMSAnalyticsEvent, TopNavigationEntry, TopNavigationResult } from "../types";
|
|
7
|
+
import { IconForView } from "../util";
|
|
8
|
+
import { cls, IconButton, Menu, MenuItem, MoreVertIcon, Tooltip, Typography } from "@firecms/ui";
|
|
9
|
+
import { useAnalyticsController } from "../hooks/useAnalyticsController";
|
|
10
|
+
import { DrawerNavigationItem } from "./DrawerNavigationItem";
|
|
11
|
+
import { FireCMSLogo } from "../components";
|
|
12
|
+
import { useApp } from "../app/useApp";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Default drawer used in the CMS
|
|
16
|
+
* @group Core
|
|
17
|
+
*/
|
|
18
|
+
export function DefaultDrawer({
|
|
19
|
+
className,
|
|
20
|
+
style,
|
|
21
|
+
}: {
|
|
22
|
+
className?: string
|
|
23
|
+
style?: React.CSSProperties,
|
|
24
|
+
}) {
|
|
25
|
+
|
|
26
|
+
const {
|
|
27
|
+
drawerHovered,
|
|
28
|
+
drawerOpen,
|
|
29
|
+
closeDrawer,
|
|
30
|
+
logo
|
|
31
|
+
} = useApp();
|
|
32
|
+
|
|
33
|
+
const analyticsController = useAnalyticsController();
|
|
34
|
+
const navigation = useNavigationController();
|
|
35
|
+
|
|
36
|
+
const tooltipsOpen = drawerHovered && !drawerOpen;
|
|
37
|
+
const largeLayout = useLargeLayout();
|
|
38
|
+
const navigate = useNavigate();
|
|
39
|
+
|
|
40
|
+
const [adminMenuOpen, setAdminMenuOpen] = React.useState(false);
|
|
41
|
+
|
|
42
|
+
if (!navigation.topLevelNavigation)
|
|
43
|
+
throw Error("Navigation not ready in Drawer");
|
|
44
|
+
|
|
45
|
+
const {
|
|
46
|
+
navigationEntries,
|
|
47
|
+
groups
|
|
48
|
+
}: TopNavigationResult = navigation.topLevelNavigation;
|
|
49
|
+
|
|
50
|
+
const adminViews = navigationEntries.filter(e => e.type === "admin") ?? [];
|
|
51
|
+
const groupsWithoutAdmin = groups.filter(g => g !== "Admin");
|
|
52
|
+
|
|
53
|
+
const buildGroupHeader = useCallback((group?: string) => {
|
|
54
|
+
if (!drawerOpen) return <div className="h-12 w-full"/>;
|
|
55
|
+
return <div
|
|
56
|
+
className="pt-8 pl-6 pr-8 pb-2 flex flex-row items-center">
|
|
57
|
+
<Typography variant={"caption"}
|
|
58
|
+
color={"secondary"}
|
|
59
|
+
className="font-medium flex-grow line-clamp-1">
|
|
60
|
+
{group ? group.toUpperCase() : "Views".toUpperCase()}
|
|
61
|
+
</Typography>
|
|
62
|
+
|
|
63
|
+
</div>;
|
|
64
|
+
}, [drawerOpen]);
|
|
65
|
+
|
|
66
|
+
const onClick = (view: TopNavigationEntry) => {
|
|
67
|
+
const eventName: CMSAnalyticsEvent = view.type === "collection"
|
|
68
|
+
? "drawer_navigate_to_collection"
|
|
69
|
+
: (view.type === "view" ? "drawer_navigate_to_view" : "unmapped_event");
|
|
70
|
+
analyticsController.onAnalyticsEvent?.(eventName, { url: view.url });
|
|
71
|
+
if (!largeLayout)
|
|
72
|
+
closeDrawer();
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
return (
|
|
76
|
+
<>
|
|
77
|
+
<div className={cls("flex flex-col h-full relative flex-grow w-full", className)} style={style}>
|
|
78
|
+
|
|
79
|
+
<DrawerLogo logo={logo}/>
|
|
80
|
+
|
|
81
|
+
<div className={"overflow-scroll no-scrollbar"}>
|
|
82
|
+
|
|
83
|
+
{groupsWithoutAdmin.map((group) => (
|
|
84
|
+
<React.Fragment
|
|
85
|
+
key={`drawer_group_${group}`}>
|
|
86
|
+
{buildGroupHeader(group)}
|
|
87
|
+
{Object.values(navigationEntries)
|
|
88
|
+
.filter(e => e.group === group)
|
|
89
|
+
.map((view, index) =>
|
|
90
|
+
<DrawerNavigationItem
|
|
91
|
+
key={`navigation_${index}`}
|
|
92
|
+
icon={<IconForView collectionOrView={view.collection ?? view.view}/>}
|
|
93
|
+
tooltipsOpen={tooltipsOpen}
|
|
94
|
+
drawerOpen={drawerOpen}
|
|
95
|
+
onClick={() => onClick(view)}
|
|
96
|
+
url={view.url}
|
|
97
|
+
name={view.name}/>)}
|
|
98
|
+
</React.Fragment>
|
|
99
|
+
))}
|
|
100
|
+
|
|
101
|
+
</div>
|
|
102
|
+
|
|
103
|
+
{adminViews.length > 0 && <Menu
|
|
104
|
+
open={adminMenuOpen}
|
|
105
|
+
onOpenChange={setAdminMenuOpen}
|
|
106
|
+
trigger={
|
|
107
|
+
<IconButton
|
|
108
|
+
shape={"square"}
|
|
109
|
+
className={"m-4 text-gray-900 dark:text-white w-fit"}>
|
|
110
|
+
<Tooltip title={"Admin"}
|
|
111
|
+
open={tooltipsOpen}
|
|
112
|
+
side={"right"} sideOffset={28}>
|
|
113
|
+
<MoreVertIcon/>
|
|
114
|
+
</Tooltip>
|
|
115
|
+
{drawerOpen && <div
|
|
116
|
+
className={cls(
|
|
117
|
+
drawerOpen ? "opacity-100" : "opacity-0 hidden",
|
|
118
|
+
"mx-4 font-inherit text-inherit"
|
|
119
|
+
)}>
|
|
120
|
+
ADMIN
|
|
121
|
+
</div>}
|
|
122
|
+
</IconButton>}
|
|
123
|
+
>
|
|
124
|
+
{adminViews.map((entry, index) =>
|
|
125
|
+
<MenuItem
|
|
126
|
+
onClick={(event) => {
|
|
127
|
+
event.preventDefault();
|
|
128
|
+
navigate(entry.path);
|
|
129
|
+
}}
|
|
130
|
+
key={`navigation_${index}`}>
|
|
131
|
+
{<IconForView collectionOrView={entry.view}/>}
|
|
132
|
+
{entry.name}
|
|
133
|
+
</MenuItem>)}
|
|
134
|
+
|
|
135
|
+
</Menu>}
|
|
136
|
+
</div>
|
|
137
|
+
|
|
138
|
+
</>
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* This is the logo displayed in the drawer
|
|
144
|
+
* It expands when the drawer is open.
|
|
145
|
+
*
|
|
146
|
+
* @param logo
|
|
147
|
+
|
|
148
|
+
*/
|
|
149
|
+
export function DrawerLogo({ logo }: {
|
|
150
|
+
logo?: string;
|
|
151
|
+
}) {
|
|
152
|
+
|
|
153
|
+
const navigation = useNavigationController();
|
|
154
|
+
const { drawerOpen } = useApp();
|
|
155
|
+
return <div
|
|
156
|
+
style={{
|
|
157
|
+
transition: "padding 100ms cubic-bezier(0.4, 0, 0.6, 1) 0ms",
|
|
158
|
+
padding: drawerOpen ? "32px 144px 0px 24px" : "72px 16px 0px"
|
|
159
|
+
}}
|
|
160
|
+
className={cls("cursor-pointer")}>
|
|
161
|
+
|
|
162
|
+
<Tooltip title={"Home"}
|
|
163
|
+
sideOffset={20}
|
|
164
|
+
side="right">
|
|
165
|
+
<Link
|
|
166
|
+
to={navigation.basePath}>
|
|
167
|
+
{logo
|
|
168
|
+
? <img src={logo}
|
|
169
|
+
alt="Logo"
|
|
170
|
+
className={cls("max-w-full max-h-full",
|
|
171
|
+
drawerOpen ?? "w-[112px] h-[112px]")}/>
|
|
172
|
+
: <FireCMSLogo/>}
|
|
173
|
+
|
|
174
|
+
</Link>
|
|
175
|
+
</Tooltip>
|
|
176
|
+
</div>;
|
|
177
|
+
}
|