@strapi/content-type-builder 5.54.0 → 5.55.1
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/dist/admin/components/AIChat/hooks/useAIFetch.js +6 -2
- package/dist/admin/components/AIChat/hooks/useAIFetch.js.map +1 -1
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs +7 -3
- package/dist/admin/components/AIChat/hooks/useAIFetch.mjs.map +1 -1
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js +20 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.js.map +1 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs +18 -0
- package/dist/admin/components/AIChat/hooks/usePrefetchAIToken.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js +83 -59
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs +86 -62
- package/dist/admin/components/ContentTypeBuilderNav/ContentTypeBuilderNav.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js +112 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs +110 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js +159 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs +157 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js +311 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs +309 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js +379 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs +376 -0
- package/dist/admin/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js +172 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs +166 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useContentTypeBuilderMenu.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js +62 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs +60 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useFolderActions.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js +145 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs +143 -0
- package/dist/admin/components/ContentTypeBuilderNav/hooks/useSortableTree.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js +176 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs +169 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js +277 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs +273 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js +62 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.js.map +1 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs +58 -0
- package/dist/admin/components/ContentTypeBuilderNav/lib/flatModel.mjs.map +1 -0
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +70 -8
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +70 -8
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +411 -33
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +411 -33
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.js +11 -2
- package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.mjs +11 -2
- package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/contentStructure.js +150 -0
- package/dist/admin/components/DataManager/utils/contentStructure.js.map +1 -0
- package/dist/admin/components/DataManager/utils/contentStructure.mjs +133 -0
- package/dist/admin/components/DataManager/utils/contentStructure.mjs.map +1 -0
- package/dist/admin/components/FolderSelect.js +200 -0
- package/dist/admin/components/FolderSelect.js.map +1 -0
- package/dist/admin/components/FolderSelect.mjs +198 -0
- package/dist/admin/components/FolderSelect.mjs.map +1 -0
- package/dist/admin/components/FormModal/FormModal.js +23 -2
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +23 -2
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/contentType/contentTypeForm.js +15 -18
- package/dist/admin/components/FormModal/contentType/contentTypeForm.js.map +1 -1
- package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs +15 -18
- package/dist/admin/components/FormModal/contentType/contentTypeForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/reducer.js +6 -0
- package/dist/admin/components/FormModal/reducer.js.map +1 -1
- package/dist/admin/components/FormModal/reducer.mjs +6 -0
- package/dist/admin/components/FormModal/reducer.mjs.map +1 -1
- package/dist/admin/pages/App/index.js +2 -5
- package/dist/admin/pages/App/index.js.map +1 -1
- package/dist/admin/pages/App/index.mjs +2 -5
- package/dist/admin/pages/App/index.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/hooks/usePrefetchAIToken.d.ts +1 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/DeleteFolderDialog.d.ts +16 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNameField.d.ts +12 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/FolderNavSection.d.ts +14 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/components/FolderNav/SortableTreeRow.d.ts +38 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/{useContentTypeBuilderMenu.d.ts → hooks/useContentTypeBuilderMenu.d.ts} +17 -7
- package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useFolderActions.d.ts +42 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/hooks/useSortableTree.d.ts +53 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/buildFolderTree.d.ts +42 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/dropProjection.d.ts +58 -0
- package/dist/admin/src/components/ContentTypeBuilderNav/lib/flatModel.d.ts +18 -0
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +41 -0
- package/dist/admin/src/components/DataManager/reducer.d.ts +105 -1
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +5 -1
- package/dist/admin/src/components/DataManager/utils/contentStructure.d.ts +68 -0
- package/dist/admin/src/components/FolderSelect.d.ts +18 -0
- package/dist/admin/src/components/FormModal/contentType/contentTypeForm.d.ts +0 -21
- package/dist/admin/src/components/FormModal/forms/forms.d.ts +0 -10
- package/dist/admin/src/components/FormModal/reducer.d.ts +7 -0
- package/dist/admin/src/utils/folderTelemetry.d.ts +5 -0
- package/dist/admin/translations/en.json.js +23 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +23 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/folderTelemetry.js +19 -0
- package/dist/admin/utils/folderTelemetry.js.map +1 -0
- package/dist/admin/utils/folderTelemetry.mjs +16 -0
- package/dist/admin/utils/folderTelemetry.mjs.map +1 -0
- package/dist/server/controllers/schema.js +1 -1
- package/dist/server/controllers/schema.js.map +1 -1
- package/dist/server/controllers/schema.mjs +1 -1
- package/dist/server/controllers/schema.mjs.map +1 -1
- package/dist/server/controllers/validation/common.js +3 -0
- package/dist/server/controllers/validation/common.js.map +1 -1
- package/dist/server/controllers/validation/common.mjs +3 -1
- package/dist/server/controllers/validation/common.mjs.map +1 -1
- package/dist/server/controllers/validation/content-structure.js +177 -0
- package/dist/server/controllers/validation/content-structure.js.map +1 -0
- package/dist/server/controllers/validation/content-structure.mjs +173 -0
- package/dist/server/controllers/validation/content-structure.mjs.map +1 -0
- package/dist/server/controllers/validation/schema.js +3 -1
- package/dist/server/controllers/validation/schema.js.map +1 -1
- package/dist/server/controllers/validation/schema.mjs +3 -1
- package/dist/server/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/register.js +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/content-api.js +4 -4
- package/dist/server/routes/content-api.js.map +1 -1
- package/dist/server/routes/content-api.mjs +4 -4
- package/dist/server/routes/content-api.mjs.map +1 -1
- package/dist/server/services/api-handler.js +37 -4
- package/dist/server/services/api-handler.js.map +1 -1
- package/dist/server/services/api-handler.mjs +36 -5
- package/dist/server/services/api-handler.mjs.map +1 -1
- package/dist/server/services/content-structure.js +174 -0
- package/dist/server/services/content-structure.js.map +1 -0
- package/dist/server/services/content-structure.mjs +172 -0
- package/dist/server/services/content-structure.mjs.map +1 -0
- package/dist/server/services/content-types.js +196 -44
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +195 -45
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/schema-builder/index.js +4 -2
- package/dist/server/services/schema-builder/index.js.map +1 -1
- package/dist/server/services/schema-builder/index.mjs +4 -2
- package/dist/server/services/schema-builder/index.mjs.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.js +16 -16
- package/dist/server/services/schema-builder/schema-handler.js.map +1 -1
- package/dist/server/services/schema-builder/schema-handler.mjs +16 -16
- package/dist/server/services/schema-builder/schema-handler.mjs.map +1 -1
- package/dist/server/services/schema-mutation.js +46 -0
- package/dist/server/services/schema-mutation.js.map +1 -0
- package/dist/server/services/schema-mutation.mjs +43 -0
- package/dist/server/services/schema-mutation.mjs.map +1 -0
- package/dist/server/services/schema.js +134 -79
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/services/schema.mjs +135 -80
- package/dist/server/services/schema.mjs.map +1 -1
- package/dist/server/src/controllers/schema.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/common.d.ts +1 -0
- package/dist/server/src/controllers/validation/common.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-structure.d.ts +56 -0
- package/dist/server/src/controllers/validation/content-structure.d.ts.map +1 -0
- package/dist/server/src/controllers/validation/schema.d.ts +35 -0
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +3 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/routes/content-api.d.ts.map +1 -1
- package/dist/server/src/services/api-handler.d.ts +13 -1
- package/dist/server/src/services/api-handler.d.ts.map +1 -1
- package/dist/server/src/services/content-structure.d.ts +37 -0
- package/dist/server/src/services/content-structure.d.ts.map +1 -0
- package/dist/server/src/services/content-types.d.ts +4 -0
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +4 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/index.d.ts +3 -1
- package/dist/server/src/services/schema-builder/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/schema-handler.d.ts.map +1 -1
- package/dist/server/src/services/schema-mutation.d.ts +26 -0
- package/dist/server/src/services/schema-mutation.d.ts.map +1 -0
- package/dist/server/src/services/schema.d.ts +1 -0
- package/dist/server/src/services/schema.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/package.json +6 -6
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js +0 -157
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.js.map +0 -1
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs +0 -151
- package/dist/admin/components/ContentTypeBuilderNav/useContentTypeBuilderMenu.mjs.map +0 -1
|
@@ -1,4 +1,14 @@
|
|
|
1
|
-
import type { Status } from '
|
|
1
|
+
import type { Status } from '../../../types';
|
|
2
|
+
import type { SectionKey } from '../../DataManager/utils/contentStructure';
|
|
3
|
+
import type { ContentTypeLink } from '../lib/buildFolderTree';
|
|
4
|
+
export type FolderMenuSection = {
|
|
5
|
+
onCreateContentType: () => void;
|
|
6
|
+
links: ContentTypeLink[];
|
|
7
|
+
createTypeLabel: string;
|
|
8
|
+
section: SectionKey;
|
|
9
|
+
sectionId: string;
|
|
10
|
+
title: string;
|
|
11
|
+
};
|
|
2
12
|
type Link = {
|
|
3
13
|
name: string;
|
|
4
14
|
to: string;
|
|
@@ -10,7 +20,7 @@ type SubSection = {
|
|
|
10
20
|
title: string;
|
|
11
21
|
links: Link[];
|
|
12
22
|
};
|
|
13
|
-
type
|
|
23
|
+
export type FlatMenuSection = {
|
|
14
24
|
name: string;
|
|
15
25
|
title: {
|
|
16
26
|
id: string;
|
|
@@ -24,13 +34,13 @@ type MenuSection = {
|
|
|
24
34
|
links: Array<SubSection | Link>;
|
|
25
35
|
linksCount?: number;
|
|
26
36
|
};
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
37
|
+
export declare function useContentTypeBuilderMenu(): {
|
|
38
|
+
folderSections: FolderMenuSection[];
|
|
39
|
+
flatSections: FlatMenuSection[];
|
|
30
40
|
search: {
|
|
31
|
-
value: string;
|
|
32
|
-
onChange: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
33
41
|
clear: () => void;
|
|
42
|
+
onChange: import("react").Dispatch<import("react").SetStateAction<string>>;
|
|
43
|
+
value: string;
|
|
34
44
|
};
|
|
35
45
|
};
|
|
36
46
|
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { SectionKey } from '../../DataManager/utils/contentStructure';
|
|
2
|
+
import type { UID } from '@strapi/types';
|
|
3
|
+
export declare const useFolderActions: () => {
|
|
4
|
+
createFolder: (payload: {
|
|
5
|
+
section: SectionKey;
|
|
6
|
+
name: string;
|
|
7
|
+
parentId: string | null;
|
|
8
|
+
}) => void;
|
|
9
|
+
renameFolder: (payload: {
|
|
10
|
+
section: SectionKey;
|
|
11
|
+
id: string;
|
|
12
|
+
name: string;
|
|
13
|
+
}) => void;
|
|
14
|
+
moveFolder: (payload: {
|
|
15
|
+
section: SectionKey;
|
|
16
|
+
id: string;
|
|
17
|
+
newParentId: string | null;
|
|
18
|
+
index?: number;
|
|
19
|
+
}) => void;
|
|
20
|
+
deleteFolderOnly: (payload: {
|
|
21
|
+
section: SectionKey;
|
|
22
|
+
id: string;
|
|
23
|
+
}) => void;
|
|
24
|
+
deleteFolderAndContent: (payload: {
|
|
25
|
+
section: SectionKey;
|
|
26
|
+
id: string;
|
|
27
|
+
contentTypeUids: UID.ContentType[];
|
|
28
|
+
}) => void;
|
|
29
|
+
assignContentTypeToFolder: (payload: {
|
|
30
|
+
section: SectionKey;
|
|
31
|
+
uid: UID.ContentType;
|
|
32
|
+
targetGroupId: string | null;
|
|
33
|
+
index?: number;
|
|
34
|
+
}) => void;
|
|
35
|
+
reorderFolderChildren: (payload: {
|
|
36
|
+
section: SectionKey;
|
|
37
|
+
groupId: string;
|
|
38
|
+
from: number;
|
|
39
|
+
to: number;
|
|
40
|
+
}) => void;
|
|
41
|
+
};
|
|
42
|
+
export type FolderActions = ReturnType<typeof useFolderActions>;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { FolderTreeNode } from '../lib/buildFolderTree';
|
|
2
|
+
import type { DropTarget } from '../lib/dropProjection';
|
|
3
|
+
import type { FlatItem } from '../lib/flatModel';
|
|
4
|
+
import type { CollisionDetection, DragMoveEvent, DragStartEvent, SensorDescriptor } from '@dnd-kit/core';
|
|
5
|
+
import type { SortingStrategy } from '@dnd-kit/sortable';
|
|
6
|
+
/** The insertion line to paint, plus the depth its left edge indents to. */
|
|
7
|
+
export type DropLine = {
|
|
8
|
+
anchorId: string;
|
|
9
|
+
edge: 'top' | 'bottom';
|
|
10
|
+
depth: number;
|
|
11
|
+
};
|
|
12
|
+
interface UseSortableTreeOptions {
|
|
13
|
+
/** Commit a drop. Called only for a real move, with the node and its resolved target. */
|
|
14
|
+
onDrop: (activeNode: FolderTreeNode, target: DropTarget) => void;
|
|
15
|
+
/**
|
|
16
|
+
* Function which determines whether the dragged node may land on the resolved target.
|
|
17
|
+
*/
|
|
18
|
+
canDrop?: (activeNode: FolderTreeNode, target: DropTarget) => boolean;
|
|
19
|
+
/** Spring-open a closed folder held under the pointer, so the user can drop deeper. */
|
|
20
|
+
onExpandFolder: (folderId: string) => void;
|
|
21
|
+
/** Ids of collapsed folders — used to tell a closed folder (springs open) from an empty one. */
|
|
22
|
+
collapsed: Set<string>;
|
|
23
|
+
/** When true the contentStructure tree is read-only. */
|
|
24
|
+
disabled: boolean;
|
|
25
|
+
/** The full flattened, visible tree (descendants of collapsed folders omitted). */
|
|
26
|
+
items: FlatItem[];
|
|
27
|
+
}
|
|
28
|
+
export interface UseSortableTreeResult {
|
|
29
|
+
collisionDetection: CollisionDetection;
|
|
30
|
+
sensors: SensorDescriptor<object>[];
|
|
31
|
+
sortingStrategy: SortingStrategy;
|
|
32
|
+
/** The items to render (the dragged folder's descendants are hidden mid-drag). */
|
|
33
|
+
renderedItems: FlatItem[];
|
|
34
|
+
/** The row being dragged, or null. */
|
|
35
|
+
activeItem: FlatItem | null;
|
|
36
|
+
/** Folder row (by dnd id) to highlight as the nest target — no line is drawn for it. */
|
|
37
|
+
dropTargetId: string | null;
|
|
38
|
+
/** The insertion line to paint, or null when nesting into a highlighted folder. */
|
|
39
|
+
dropLine: DropLine | null;
|
|
40
|
+
onDragStart: (event: DragStartEvent) => void;
|
|
41
|
+
onDragMove: (event: DragMoveEvent) => void;
|
|
42
|
+
onDragCancel: () => void;
|
|
43
|
+
onDragEnd: () => void;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The drag-and-drop engine for a flattened folder tree: it owns the drag state
|
|
47
|
+
* machine, pointer-vs-row geometry, spring-open timers and drop projection, and
|
|
48
|
+
* returns the props a `DndContext` + `SortableContext` need plus the resolved
|
|
49
|
+
* drop indicator. It carries no domain logic — nesting rules, the move itself,
|
|
50
|
+
* and expansion are supplied by the caller through {@link UseSortableTreeOptions}.
|
|
51
|
+
*/
|
|
52
|
+
export declare const useSortableTree: ({ onExpandFolder, collapsed, disabled, onDrop, canDrop, items, }: UseSortableTreeOptions) => UseSortableTreeResult;
|
|
53
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { Status } from '../../../types';
|
|
2
|
+
import type { ContentStructureSection, GroupStatus } from '../../DataManager/utils/contentStructure';
|
|
3
|
+
import type { UID } from '@strapi/types';
|
|
4
|
+
export type ContentTypeLink = {
|
|
5
|
+
uid: UID.ContentType;
|
|
6
|
+
to: string;
|
|
7
|
+
title: string;
|
|
8
|
+
status: Status;
|
|
9
|
+
};
|
|
10
|
+
export type FolderNode = {
|
|
11
|
+
type: 'folder';
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
status: GroupStatus;
|
|
15
|
+
depth: number;
|
|
16
|
+
parentId: string | null;
|
|
17
|
+
children: FolderTreeNode[];
|
|
18
|
+
};
|
|
19
|
+
export type ContentTypeNode = {
|
|
20
|
+
type: 'contentType';
|
|
21
|
+
uid: UID.ContentType;
|
|
22
|
+
to: string;
|
|
23
|
+
title: string;
|
|
24
|
+
status: Status;
|
|
25
|
+
depth: number;
|
|
26
|
+
parentId: string | null;
|
|
27
|
+
};
|
|
28
|
+
export type FolderTreeNode = FolderNode | ContentTypeNode;
|
|
29
|
+
export declare function buildSectionTree(section: ContentStructureSection, links: ContentTypeLink[], compareTitle: (a: string, b: string) => number): FolderTreeNode[];
|
|
30
|
+
export declare function filterTree(nodes: FolderTreeNode[], matches: (text: string) => boolean): FolderTreeNode[];
|
|
31
|
+
export declare function subtreeFolderHeight(folder: FolderNode): number;
|
|
32
|
+
/**
|
|
33
|
+
* Whether moving `folder` under a target (a folder, or `null` for the section
|
|
34
|
+
* root) would keep the resulting subtree within {@link MAX_FOLDER_DEPTH}.
|
|
35
|
+
*/
|
|
36
|
+
export declare function canNestFolderAt(folder: FolderNode, target: FolderNode | null): boolean;
|
|
37
|
+
export declare function countSubtree(section: ContentStructureSection, folderId: string, countableUids: ReadonlySet<UID.ContentType>): {
|
|
38
|
+
contentTypes: number;
|
|
39
|
+
subfolders: number;
|
|
40
|
+
};
|
|
41
|
+
export declare function collectSubtreeContentTypeUids(section: ContentStructureSection, folderId: string): UID.ContentType[];
|
|
42
|
+
export declare function indexFolders(nodes: FolderTreeNode[]): Map<string, FolderNode>;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import type { FlatItem } from './flatModel';
|
|
2
|
+
export declare const INDENT_WIDTH = 24;
|
|
3
|
+
export type DropLine = {
|
|
4
|
+
edge: 'top' | 'bottom';
|
|
5
|
+
anchorId: string;
|
|
6
|
+
};
|
|
7
|
+
export type InsertTarget = {
|
|
8
|
+
parentId: string | null;
|
|
9
|
+
line: DropLine | null;
|
|
10
|
+
index: number;
|
|
11
|
+
depth: number;
|
|
12
|
+
};
|
|
13
|
+
export type DropTarget = {
|
|
14
|
+
kind: 'nest';
|
|
15
|
+
folderId: string;
|
|
16
|
+
depth: number;
|
|
17
|
+
} | ({
|
|
18
|
+
kind: 'insert';
|
|
19
|
+
} & InsertTarget);
|
|
20
|
+
type DragState = {
|
|
21
|
+
activeId: string;
|
|
22
|
+
overId: string;
|
|
23
|
+
offsetX: number;
|
|
24
|
+
pointer?: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
};
|
|
28
|
+
overRect?: {
|
|
29
|
+
top: number;
|
|
30
|
+
height: number;
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* This resolved the destination for a drag-and-drop operation in the contentStructure tree. It takes into account the active item being dragged, the item it is being dropped over, the horizontal offset of the drag, and optionally which side of the target item the drop is intended for.
|
|
35
|
+
* It returns a DropTarget object that describes where the active item should be placed in relation to its siblings and parent in the tree structure.
|
|
36
|
+
*
|
|
37
|
+
* When the dragged row is over a non-folder row, the drop target is always a sibling of that row (and its destination is based on which half of the row the pointer is over).
|
|
38
|
+
*
|
|
39
|
+
* When the dragged row is over a folder row, the drop target can be either a sibling of that folder (if the pointer is over the top or bottom third of the row) or a child of that folder (if the pointer is over the middle third of the row).
|
|
40
|
+
* If the folder is collapsed, dropping into it will expand it and place the active row inside it.
|
|
41
|
+
*
|
|
42
|
+
* If the destination is nested such that the destination could be one of several depths, the depth is determined by the horizontal offset of the pointer.
|
|
43
|
+
*
|
|
44
|
+
* This allows for a user to position a row at the end of a folder, even if there are several expanded folders above the destination. Otherwise, this would be a multi-step operation.
|
|
45
|
+
*
|
|
46
|
+
*/
|
|
47
|
+
export declare function resolveDropTarget(items: FlatItem[], dragState: DragState): DropTarget | null;
|
|
48
|
+
export type FolderDropZone = 'before' | 'nest' | 'after';
|
|
49
|
+
type CalculateFolderDropZoneProps = {
|
|
50
|
+
itemBoundingBox: {
|
|
51
|
+
top: number;
|
|
52
|
+
height: number;
|
|
53
|
+
};
|
|
54
|
+
hasVisibleChildren: boolean;
|
|
55
|
+
pointerY: number;
|
|
56
|
+
};
|
|
57
|
+
export declare function calculateFolderDropZone({ hasVisibleChildren, itemBoundingBox, pointerY, }: CalculateFolderDropZoneProps): FolderDropZone;
|
|
58
|
+
export {};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FolderTreeNode } from './buildFolderTree';
|
|
2
|
+
export type FlatItem = {
|
|
3
|
+
parentId: string | null;
|
|
4
|
+
node: FolderTreeNode;
|
|
5
|
+
collapsed: boolean;
|
|
6
|
+
depth: number;
|
|
7
|
+
id: string;
|
|
8
|
+
};
|
|
9
|
+
export declare const itemId: (node: FolderTreeNode) => string;
|
|
10
|
+
/**
|
|
11
|
+
* Flatten a contentStructure tree into visible, ordered rows. Descendants of a collapsed folder are omitted.
|
|
12
|
+
*/
|
|
13
|
+
export declare function flattenSortableTree(nodes: FolderTreeNode[], collapsed: Set<string>, parentId?: string | null, depth?: number): FlatItem[];
|
|
14
|
+
/**
|
|
15
|
+
* Return a contentStructure without the active element's children.
|
|
16
|
+
* This is used to hide a dragged folder's descendants so it can't be dropped into its own subtree.
|
|
17
|
+
*/
|
|
18
|
+
export declare function removeSubtree(items: FlatItem[], activeId: string): FlatItem[];
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContentStructure, FolderSelection, SectionKey } from './utils/contentStructure';
|
|
1
2
|
import type { Component, ContentType } from '../../types';
|
|
2
3
|
import type { ComponentWithChildren } from './utils/retrieveComponentsThatHaveComponents';
|
|
3
4
|
import type { NestedComponent } from './utils/retrieveNestedComponents';
|
|
@@ -56,6 +57,7 @@ export interface DataManagerContextValue {
|
|
|
56
57
|
pluginOptions: Record<string, unknown>;
|
|
57
58
|
};
|
|
58
59
|
uid: Internal.UID.Schema;
|
|
60
|
+
folder?: FolderSelection;
|
|
59
61
|
}) => void;
|
|
60
62
|
changeDynamicZoneComponents: (opts: {
|
|
61
63
|
forTarget: Struct.ModelType;
|
|
@@ -70,6 +72,44 @@ export interface DataManagerContextValue {
|
|
|
70
72
|
}) => void;
|
|
71
73
|
deleteComponent(uid: Internal.UID.Component): void;
|
|
72
74
|
deleteContentType(uid: Internal.UID.ContentType): void;
|
|
75
|
+
contentStructure: ContentStructure;
|
|
76
|
+
createFolder: (opts: {
|
|
77
|
+
section: SectionKey;
|
|
78
|
+
name: string;
|
|
79
|
+
parentId: string | null;
|
|
80
|
+
}) => void;
|
|
81
|
+
renameFolder: (opts: {
|
|
82
|
+
section: SectionKey;
|
|
83
|
+
id: string;
|
|
84
|
+
name: string;
|
|
85
|
+
}) => void;
|
|
86
|
+
moveFolder: (opts: {
|
|
87
|
+
section: SectionKey;
|
|
88
|
+
id: string;
|
|
89
|
+
newParentId: string | null;
|
|
90
|
+
index?: number;
|
|
91
|
+
}) => void;
|
|
92
|
+
deleteFolderOnly: (opts: {
|
|
93
|
+
section: SectionKey;
|
|
94
|
+
id: string;
|
|
95
|
+
}) => void;
|
|
96
|
+
deleteFolderAndContent: (opts: {
|
|
97
|
+
section: SectionKey;
|
|
98
|
+
id: string;
|
|
99
|
+
contentTypeUids: Internal.UID.ContentType[];
|
|
100
|
+
}) => void;
|
|
101
|
+
assignContentTypeToFolder: (opts: {
|
|
102
|
+
section: SectionKey;
|
|
103
|
+
uid: Internal.UID.ContentType;
|
|
104
|
+
targetGroupId: string | null;
|
|
105
|
+
index?: number;
|
|
106
|
+
}) => void;
|
|
107
|
+
reorderFolderChildren: (opts: {
|
|
108
|
+
section: SectionKey;
|
|
109
|
+
groupId: string;
|
|
110
|
+
from: number;
|
|
111
|
+
to: number;
|
|
112
|
+
}) => void;
|
|
73
113
|
removeComponentFromDynamicZone: (opts: {
|
|
74
114
|
forTarget: Struct.ModelType;
|
|
75
115
|
targetUid: Internal.UID.Schema;
|
|
@@ -106,6 +146,7 @@ export interface DataManagerContextValue {
|
|
|
106
146
|
pluginOptions: Record<string, unknown>;
|
|
107
147
|
};
|
|
108
148
|
uid: Internal.UID.ContentType;
|
|
149
|
+
folder?: FolderSelection;
|
|
109
150
|
}) => void;
|
|
110
151
|
initialComponents: Record<Internal.UID.Component, Component>;
|
|
111
152
|
components: Record<Internal.UID.Component, Component>;
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
import type { Components, ContentTypes, ContentType, Component, AnyAttribute } from '../../types';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ContentStructure, SectionKey } from './utils/contentStructure';
|
|
3
|
+
import type { Internal, Struct, UID } from '@strapi/types';
|
|
3
4
|
export interface DataManagerStateType {
|
|
4
5
|
components: Components;
|
|
5
6
|
initialComponents: Components;
|
|
6
7
|
contentTypes: ContentTypes;
|
|
7
8
|
initialContentTypes: ContentTypes;
|
|
9
|
+
contentStructure: ContentStructure;
|
|
10
|
+
initialContentStructure: ContentStructure;
|
|
8
11
|
reservedNames: {
|
|
9
12
|
models: string[];
|
|
10
13
|
attributes: string[];
|
|
@@ -21,6 +24,43 @@ type InitPayload = {
|
|
|
21
24
|
components: Record<string, Component>;
|
|
22
25
|
contentTypes: Record<string, ContentType>;
|
|
23
26
|
reservedNames: DataManagerStateType['reservedNames'];
|
|
27
|
+
contentStructure?: ContentStructure;
|
|
28
|
+
};
|
|
29
|
+
type CreateFolderPayload = {
|
|
30
|
+
parentId: string | null;
|
|
31
|
+
section: SectionKey;
|
|
32
|
+
name: string;
|
|
33
|
+
id: string;
|
|
34
|
+
};
|
|
35
|
+
type RenameFolderPayload = {
|
|
36
|
+
section: SectionKey;
|
|
37
|
+
name: string;
|
|
38
|
+
id: string;
|
|
39
|
+
};
|
|
40
|
+
type MoveFolderPayload = {
|
|
41
|
+
newParentId: string | null;
|
|
42
|
+
section: SectionKey;
|
|
43
|
+
index?: number;
|
|
44
|
+
id: string;
|
|
45
|
+
};
|
|
46
|
+
type DeleteFolderPayload = {
|
|
47
|
+
section: SectionKey;
|
|
48
|
+
id: string;
|
|
49
|
+
};
|
|
50
|
+
type DeleteFolderAndContentPayload = DeleteFolderPayload & {
|
|
51
|
+
contentTypeUids: Internal.UID.ContentType[];
|
|
52
|
+
};
|
|
53
|
+
type AssignContentTypeToFolderPayload = {
|
|
54
|
+
targetGroupId: string | null;
|
|
55
|
+
uid: UID.ContentType;
|
|
56
|
+
section: SectionKey;
|
|
57
|
+
index?: number;
|
|
58
|
+
};
|
|
59
|
+
type ReorderFolderChildrenPayload = {
|
|
60
|
+
section: SectionKey;
|
|
61
|
+
groupId: string;
|
|
62
|
+
from: number;
|
|
63
|
+
to: number;
|
|
24
64
|
};
|
|
25
65
|
type AddAttributePayload = {
|
|
26
66
|
attributeToSet: AttributeMutation;
|
|
@@ -52,6 +92,12 @@ type CreateComponentSchemaPayload = {
|
|
|
52
92
|
};
|
|
53
93
|
componentCategory: string;
|
|
54
94
|
};
|
|
95
|
+
type FolderAssignmentPayload = {
|
|
96
|
+
targetGroupId: string | null;
|
|
97
|
+
} | {
|
|
98
|
+
newFolderId: string;
|
|
99
|
+
newFolderName: string;
|
|
100
|
+
};
|
|
55
101
|
type CreateSchemaPayload = {
|
|
56
102
|
uid: string;
|
|
57
103
|
data: {
|
|
@@ -62,6 +108,7 @@ type CreateSchemaPayload = {
|
|
|
62
108
|
draftAndPublish: boolean;
|
|
63
109
|
pluginOptions: PluginOptions;
|
|
64
110
|
};
|
|
111
|
+
folder?: FolderAssignmentPayload;
|
|
65
112
|
};
|
|
66
113
|
type EditAttributePayload = {
|
|
67
114
|
attributeToSet: AttributeMutation;
|
|
@@ -105,6 +152,7 @@ type UpdateSchemaPayload = {
|
|
|
105
152
|
pluginOptions: PluginOptions;
|
|
106
153
|
};
|
|
107
154
|
uid: string;
|
|
155
|
+
folder?: FolderAssignmentPayload;
|
|
108
156
|
};
|
|
109
157
|
type MoveAttributePayload = {
|
|
110
158
|
forTarget: Struct.ModelType;
|
|
@@ -182,6 +230,34 @@ declare const slice: import("@reduxjs/toolkit").Slice<import("./undoRedo").UndoR
|
|
|
182
230
|
payload: `admin::${string}` | `strapi::${string}` | `api::${string}.${string}` | `plugin::${string}.${string}`;
|
|
183
231
|
type: string;
|
|
184
232
|
}>;
|
|
233
|
+
createFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
234
|
+
payload: CreateFolderPayload;
|
|
235
|
+
type: string;
|
|
236
|
+
}>;
|
|
237
|
+
renameFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
238
|
+
payload: RenameFolderPayload;
|
|
239
|
+
type: string;
|
|
240
|
+
}>;
|
|
241
|
+
moveFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
242
|
+
payload: MoveFolderPayload;
|
|
243
|
+
type: string;
|
|
244
|
+
}>;
|
|
245
|
+
deleteFolderOnly: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
246
|
+
payload: DeleteFolderPayload;
|
|
247
|
+
type: string;
|
|
248
|
+
}>;
|
|
249
|
+
deleteFolderAndContent: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
250
|
+
payload: DeleteFolderAndContentPayload;
|
|
251
|
+
type: string;
|
|
252
|
+
}>;
|
|
253
|
+
assignContentTypeToFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
254
|
+
payload: AssignContentTypeToFolderPayload;
|
|
255
|
+
type: string;
|
|
256
|
+
}>;
|
|
257
|
+
reorderFolderChildren: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
258
|
+
payload: ReorderFolderChildrenPayload;
|
|
259
|
+
type: string;
|
|
260
|
+
}>;
|
|
185
261
|
applyChange: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
186
262
|
payload: {
|
|
187
263
|
action: "add" | "update" | "delete";
|
|
@@ -266,6 +342,34 @@ export declare const reducer: import("redux").Reducer<import("./undoRedo").UndoR
|
|
|
266
342
|
payload: `admin::${string}` | `strapi::${string}` | `api::${string}.${string}` | `plugin::${string}.${string}`;
|
|
267
343
|
type: string;
|
|
268
344
|
}>;
|
|
345
|
+
createFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
346
|
+
payload: CreateFolderPayload;
|
|
347
|
+
type: string;
|
|
348
|
+
}>;
|
|
349
|
+
renameFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
350
|
+
payload: RenameFolderPayload;
|
|
351
|
+
type: string;
|
|
352
|
+
}>;
|
|
353
|
+
moveFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
354
|
+
payload: MoveFolderPayload;
|
|
355
|
+
type: string;
|
|
356
|
+
}>;
|
|
357
|
+
deleteFolderOnly: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
358
|
+
payload: DeleteFolderPayload;
|
|
359
|
+
type: string;
|
|
360
|
+
}>;
|
|
361
|
+
deleteFolderAndContent: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
362
|
+
payload: DeleteFolderAndContentPayload;
|
|
363
|
+
type: string;
|
|
364
|
+
}>;
|
|
365
|
+
assignContentTypeToFolder: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
366
|
+
payload: AssignContentTypeToFolderPayload;
|
|
367
|
+
type: string;
|
|
368
|
+
}>;
|
|
369
|
+
reorderFolderChildren: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
370
|
+
payload: ReorderFolderChildrenPayload;
|
|
371
|
+
type: string;
|
|
372
|
+
}>;
|
|
269
373
|
applyChange: import("@reduxjs/toolkit").CaseReducer<import("./undoRedo").UndoRedoState<DataManagerStateType>, {
|
|
270
374
|
payload: {
|
|
271
375
|
action: "add" | "update" | "delete";
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { ContentStructure } from './contentStructure';
|
|
1
2
|
import type { Components, ContentTypes } from '../../../types';
|
|
2
3
|
import type { UID } from '@strapi/types';
|
|
3
4
|
declare const sortContentType: (types: ContentTypes) => {
|
|
@@ -22,11 +23,14 @@ type TrackingEventProperties = {
|
|
|
22
23
|
editedFields: number;
|
|
23
24
|
deletedFields: number;
|
|
24
25
|
};
|
|
25
|
-
declare const stateToRequestData: ({ components, contentTypes, }: {
|
|
26
|
+
declare const stateToRequestData: ({ components, contentTypes, contentStructure, initialContentStructure, }: {
|
|
26
27
|
components: Components;
|
|
27
28
|
contentTypes: ContentTypes;
|
|
29
|
+
contentStructure?: ContentStructure;
|
|
30
|
+
initialContentStructure?: ContentStructure;
|
|
28
31
|
}) => {
|
|
29
32
|
requestData: {
|
|
33
|
+
contentStructure?: import("@strapi/types/dist/modules/content-structure.js").ContentStructureFile | undefined;
|
|
30
34
|
components: ({
|
|
31
35
|
action: string;
|
|
32
36
|
uid: `${string}.${string}` | UID.ContentType;
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import type { Status } from '../../../types';
|
|
2
|
+
import type { Modules, Struct } from '@strapi/types';
|
|
3
|
+
export type SectionKey = Modules.ContentStructure.ContentStructureSectionKey;
|
|
4
|
+
export type ContentStructureChild = Modules.ContentStructure.ContentStructureChild;
|
|
5
|
+
/**
|
|
6
|
+
* The status of a content structure group, excluding "REMOVED".
|
|
7
|
+
* The contentStructure API is declarative, so the server will identify removed groups by their absence in the submitted structure.
|
|
8
|
+
* The admin panel will remove groups from the tree upon deletion, so the "REMOVED" status is impossible to reach.
|
|
9
|
+
*/
|
|
10
|
+
export type GroupStatus = Exclude<Status, 'REMOVED'>;
|
|
11
|
+
export type ContentStructureGroup = Modules.ContentStructure.ContentStructureGroup & {
|
|
12
|
+
status: GroupStatus;
|
|
13
|
+
};
|
|
14
|
+
export type ContentStructureSection = {
|
|
15
|
+
groups: ContentStructureGroup[];
|
|
16
|
+
};
|
|
17
|
+
export declare const CONTENT_STRUCTURE_VERSION = 1;
|
|
18
|
+
export declare const MAX_FOLDER_DEPTH = 3;
|
|
19
|
+
export type FolderSelection = {
|
|
20
|
+
targetGroupId: string | null;
|
|
21
|
+
} | {
|
|
22
|
+
newFolderName: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Admin-side model of the content-structure (folder groups).
|
|
26
|
+
*
|
|
27
|
+
* The admin is identical to the server-side structure, but for the inclusion of a `status` field on every group.
|
|
28
|
+
* This allows the admin panel to track changes to the content structure using existing patterns.
|
|
29
|
+
*
|
|
30
|
+
* The `status` field is stripped by {@link toServerFile} before a client-modified structure is sent to the server.
|
|
31
|
+
*/
|
|
32
|
+
export type ContentStructure = {
|
|
33
|
+
version: typeof CONTENT_STRUCTURE_VERSION;
|
|
34
|
+
sections: Record<SectionKey, ContentStructureSection>;
|
|
35
|
+
};
|
|
36
|
+
export declare const SECTION_KEYS: readonly ["collectionTypes", "singleTypes"];
|
|
37
|
+
export declare function sectionKeyForKind(kind: Struct.ContentTypeKind): SectionKey;
|
|
38
|
+
export declare function createEmptyContentStructure(): ContentStructure;
|
|
39
|
+
export declare function fromServerFile(file: Modules.ContentStructure.ContentStructureFile | null | undefined): ContentStructure;
|
|
40
|
+
export declare function toServerFile(structure: ContentStructure): Modules.ContentStructure.ContentStructureFile;
|
|
41
|
+
/**
|
|
42
|
+
* Determines whether two contentStructure trees differ in any way the server would persist.
|
|
43
|
+
*
|
|
44
|
+
* The client-side state manager removes groups from the tree upon deletion.
|
|
45
|
+
* This means that the "REMOVED" status is impossible to reach. See {@link GroupStatus}.
|
|
46
|
+
*/
|
|
47
|
+
export declare function hasContentStructureChanged(working: ContentStructure, initial: ContentStructure): boolean;
|
|
48
|
+
export declare function generateGroupId(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Find a sibling folder that already has a given `name`.
|
|
51
|
+
*
|
|
52
|
+
* `excludeId` skips a group by id (used when renaming, so a folder doesn't
|
|
53
|
+
* collide with itself).
|
|
54
|
+
*
|
|
55
|
+
* Returns `undefined` for an empty name or no match.
|
|
56
|
+
*/
|
|
57
|
+
export declare function findSiblingFolderByName<TGroup extends Pick<ContentStructureGroup, 'id' | 'name' | 'parent'>>(groups: TGroup[], parentId: string | null, name: string, excludeId?: string): TGroup | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* Whether a folder name is already taken by a sibling. See
|
|
60
|
+
* {@link findSiblingFolderByName}.
|
|
61
|
+
*/
|
|
62
|
+
export declare function isFolderNameTakenBySibling(groups: Pick<ContentStructureGroup, 'id' | 'name' | 'parent'>[], parentId: string | null, name: string, excludeId?: string): boolean;
|
|
63
|
+
/**
|
|
64
|
+
* Returns names that would collide if a folder were removed and its child folders inherited its
|
|
65
|
+
* parent. Both the existing destination siblings and the incoming children are compared using
|
|
66
|
+
* the same case-insensitive contract as create, rename, and move.
|
|
67
|
+
*/
|
|
68
|
+
export declare function getDeleteFolderOnlySiblingNameCollisions(groups: Pick<ContentStructureGroup, 'id' | 'name' | 'parent' | 'children'>[], groupId: string): string[];
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { FormChangeHandler, IntlLabel } from '../types';
|
|
2
|
+
import type { FolderSelection } from './DataManager/utils/contentStructure';
|
|
3
|
+
import type { Struct } from '@strapi/types';
|
|
4
|
+
interface FolderSelectProps {
|
|
5
|
+
onChange: FormChangeHandler<FolderSelection | undefined, 'content-type-folder-select'>;
|
|
6
|
+
modifiedData?: {
|
|
7
|
+
kind?: Struct.ContentTypeKind;
|
|
8
|
+
};
|
|
9
|
+
value?: FolderSelection;
|
|
10
|
+
placeholder?: IntlLabel;
|
|
11
|
+
error?: string | null;
|
|
12
|
+
isCreating?: boolean;
|
|
13
|
+
intlLabel: IntlLabel;
|
|
14
|
+
targetUid?: string;
|
|
15
|
+
name: string;
|
|
16
|
+
}
|
|
17
|
+
export declare const FolderSelect: ({ error, modifiedData, placeholder, isCreating, intlLabel, targetUid, onChange, value, name, }: FolderSelectProps) => import("react/jsx-runtime").JSX.Element;
|
|
18
|
+
export {};
|
|
@@ -40,16 +40,6 @@ export declare const contentTypeForm: {
|
|
|
40
40
|
};
|
|
41
41
|
name: string;
|
|
42
42
|
type: string;
|
|
43
|
-
size?: undefined;
|
|
44
|
-
} | {
|
|
45
|
-
type: string;
|
|
46
|
-
size: number;
|
|
47
|
-
intlLabel: {
|
|
48
|
-
id: string;
|
|
49
|
-
defaultMessage: string;
|
|
50
|
-
};
|
|
51
|
-
name: string;
|
|
52
|
-
description?: undefined;
|
|
53
43
|
})[];
|
|
54
44
|
}[];
|
|
55
45
|
};
|
|
@@ -77,17 +67,6 @@ export declare const contentTypeForm: {
|
|
|
77
67
|
type: string;
|
|
78
68
|
size?: undefined;
|
|
79
69
|
radios?: undefined;
|
|
80
|
-
} | {
|
|
81
|
-
type: string;
|
|
82
|
-
size: number;
|
|
83
|
-
intlLabel: {
|
|
84
|
-
id: string;
|
|
85
|
-
defaultMessage: string;
|
|
86
|
-
};
|
|
87
|
-
name: string;
|
|
88
|
-
disabled?: undefined;
|
|
89
|
-
description?: undefined;
|
|
90
|
-
radios?: undefined;
|
|
91
70
|
} | {
|
|
92
71
|
intlLabel: {
|
|
93
72
|
id: string;
|
|
@@ -114,16 +114,6 @@ export declare const forms: {
|
|
|
114
114
|
};
|
|
115
115
|
name: string;
|
|
116
116
|
type: string;
|
|
117
|
-
size?: undefined;
|
|
118
|
-
} | {
|
|
119
|
-
type: string;
|
|
120
|
-
size: number;
|
|
121
|
-
intlLabel: {
|
|
122
|
-
id: string;
|
|
123
|
-
defaultMessage: string;
|
|
124
|
-
};
|
|
125
|
-
name: string;
|
|
126
|
-
description?: undefined;
|
|
127
117
|
})[];
|
|
128
118
|
}[];
|
|
129
119
|
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { type PayloadAction } from '@reduxjs/toolkit';
|
|
2
|
+
import type { FolderSelection } from '../DataManager/utils/contentStructure';
|
|
2
3
|
import type { Schema, Struct, UID } from '@strapi/types';
|
|
3
4
|
import type { MessageDescriptor, PrimitiveType } from 'react-intl';
|
|
4
5
|
type FormModalError = MessageDescriptor & {
|
|
@@ -22,6 +23,7 @@ export type FormModalData = Record<string, unknown> & {
|
|
|
22
23
|
displayName?: string;
|
|
23
24
|
draftAndPublish?: boolean;
|
|
24
25
|
enum?: string[];
|
|
26
|
+
folder?: FolderSelection;
|
|
25
27
|
icon?: string;
|
|
26
28
|
kind?: Struct.ContentTypeKind;
|
|
27
29
|
multiple?: boolean;
|
|
@@ -160,6 +162,11 @@ export declare const actions: import("@reduxjs/toolkit").CaseReducerActions<{
|
|
|
160
162
|
displayName?: string | undefined;
|
|
161
163
|
draftAndPublish?: boolean | undefined;
|
|
162
164
|
enum?: string[] | undefined;
|
|
165
|
+
folder?: import("immer/dist/internal.js").WritableDraft<{
|
|
166
|
+
targetGroupId: string | null;
|
|
167
|
+
}> | import("immer/dist/internal.js").WritableDraft<{
|
|
168
|
+
newFolderName: string;
|
|
169
|
+
}> | undefined;
|
|
163
170
|
icon?: string | undefined;
|
|
164
171
|
kind?: Struct.ContentTypeKind | undefined;
|
|
165
172
|
multiple?: boolean | undefined;
|