@strapi/content-type-builder 5.55.1 → 5.57.0

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.
Files changed (152) hide show
  1. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +117 -13
  2. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
  3. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +118 -13
  4. package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
  5. package/dist/admin/components/AIChat/providers/SchemaProvider.js +31 -19
  6. package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
  7. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +31 -19
  8. package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
  9. package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
  10. package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
  11. package/dist/admin/components/DataManager/DataManagerProvider.js +166 -6
  12. package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
  13. package/dist/admin/components/DataManager/DataManagerProvider.mjs +165 -7
  14. package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
  15. package/dist/admin/components/DataManager/RenameMigrationModal.js +285 -0
  16. package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -0
  17. package/dist/admin/components/DataManager/RenameMigrationModal.mjs +257 -0
  18. package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -0
  19. package/dist/admin/components/DataManager/reducer.js +107 -2
  20. package/dist/admin/components/DataManager/reducer.js.map +1 -1
  21. package/dist/admin/components/DataManager/reducer.mjs +106 -2
  22. package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
  23. package/dist/admin/components/DataManager/utils/cleanData.js +8 -1
  24. package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
  25. package/dist/admin/components/DataManager/utils/cleanData.mjs +8 -1
  26. package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
  27. package/dist/admin/components/DataManager/utils/groupRenameChains.js +86 -0
  28. package/dist/admin/components/DataManager/utils/groupRenameChains.js.map +1 -0
  29. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs +84 -0
  30. package/dist/admin/components/DataManager/utils/groupRenameChains.mjs.map +1 -0
  31. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js +29 -0
  32. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js.map +1 -0
  33. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs +27 -0
  34. package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs.map +1 -0
  35. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js +35 -0
  36. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js.map +1 -0
  37. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs +33 -0
  38. package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs.map +1 -0
  39. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js +48 -0
  40. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js.map +1 -0
  41. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs +45 -0
  42. package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs.map +1 -0
  43. package/dist/admin/components/FormModal/FormModal.js +143 -9
  44. package/dist/admin/components/FormModal/FormModal.js.map +1 -1
  45. package/dist/admin/components/FormModal/FormModal.mjs +144 -10
  46. package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
  47. package/dist/admin/components/FormModal/attributes/validation/common.js +6 -5
  48. package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
  49. package/dist/admin/components/FormModal/attributes/validation/common.mjs +1 -1
  50. package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
  51. package/dist/admin/components/FormModal/component/createComponentSchema.js +10 -7
  52. package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
  53. package/dist/admin/components/FormModal/component/createComponentSchema.mjs +1 -1
  54. package/dist/admin/components/FormModal/component/createComponentSchema.mjs.map +1 -1
  55. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +24 -21
  56. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
  57. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs +1 -1
  58. package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs.map +1 -1
  59. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +3 -2
  60. package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
  61. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs +1 -1
  62. package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
  63. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js +73 -0
  64. package/dist/admin/components/FormModal/utils/getRenameStorageChange.js.map +1 -0
  65. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs +70 -0
  66. package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs.map +1 -0
  67. package/dist/admin/src/components/AIChat/components/AnimatedBox.d.ts +2 -2
  68. package/dist/admin/src/components/AIChat/components/Input.d.ts +2 -2
  69. package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +4 -3
  70. package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +6 -1
  71. package/dist/admin/src/components/AttributeOptions/OptionBoxWrapper.d.ts +2 -2
  72. package/dist/admin/src/components/ComponentRow.d.ts +2 -2
  73. package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +28 -2
  74. package/dist/admin/src/components/DataManager/RenameMigrationModal.d.ts +73 -0
  75. package/dist/admin/src/components/DataManager/reducer.d.ts +17 -2
  76. package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +16 -0
  77. package/dist/admin/src/components/DataManager/utils/groupRenameChains.d.ts +31 -0
  78. package/dist/admin/src/components/DataManager/utils/isStorageCompatibleRename.d.ts +10 -0
  79. package/dist/admin/src/components/DataManager/utils/resolveAfterEditRenameConsent.d.ts +24 -0
  80. package/dist/admin/src/components/DataManager/utils/splitChainsByInheritedConsent.d.ts +26 -0
  81. package/dist/admin/src/components/FormModal/utils/getRenameStorageChange.d.ts +40 -0
  82. package/dist/admin/src/components/List.d.ts +2 -2
  83. package/dist/admin/src/components/Relation/RelationNaturePicker/Components.d.ts +4 -4
  84. package/dist/admin/src/types.d.ts +23 -0
  85. package/dist/admin/translations/en.json.js +12 -0
  86. package/dist/admin/translations/en.json.js.map +1 -1
  87. package/dist/admin/translations/en.json.mjs +12 -0
  88. package/dist/admin/translations/en.json.mjs.map +1 -1
  89. package/dist/server/config.js +24 -3
  90. package/dist/server/config.js.map +1 -1
  91. package/dist/server/config.mjs +21 -3
  92. package/dist/server/config.mjs.map +1 -1
  93. package/dist/server/controllers/schema.js +2 -2
  94. package/dist/server/controllers/schema.js.map +1 -1
  95. package/dist/server/controllers/schema.mjs +1 -1
  96. package/dist/server/controllers/schema.mjs.map +1 -1
  97. package/dist/server/controllers/validation/content-type.js +9 -11
  98. package/dist/server/controllers/validation/content-type.js.map +1 -1
  99. package/dist/server/controllers/validation/content-type.mjs +7 -9
  100. package/dist/server/controllers/validation/content-type.mjs.map +1 -1
  101. package/dist/server/controllers/validation/model-schema.js +2 -3
  102. package/dist/server/controllers/validation/model-schema.js.map +1 -1
  103. package/dist/server/controllers/validation/model-schema.mjs +1 -2
  104. package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
  105. package/dist/server/controllers/validation/relations.js +1 -2
  106. package/dist/server/controllers/validation/relations.js.map +1 -1
  107. package/dist/server/controllers/validation/relations.mjs +1 -2
  108. package/dist/server/controllers/validation/relations.mjs.map +1 -1
  109. package/dist/server/controllers/validation/schema.js +42 -23
  110. package/dist/server/controllers/validation/schema.js.map +1 -1
  111. package/dist/server/controllers/validation/schema.mjs +43 -24
  112. package/dist/server/controllers/validation/schema.mjs.map +1 -1
  113. package/dist/server/index.js +1 -1
  114. package/dist/server/index.js.map +1 -1
  115. package/dist/server/services/content-types.js +1 -2
  116. package/dist/server/services/content-types.js.map +1 -1
  117. package/dist/server/services/content-types.mjs +2 -3
  118. package/dist/server/services/content-types.mjs.map +1 -1
  119. package/dist/server/services/migration-builder/index.js +580 -0
  120. package/dist/server/services/migration-builder/index.js.map +1 -0
  121. package/dist/server/services/migration-builder/index.mjs +573 -0
  122. package/dist/server/services/migration-builder/index.mjs.map +1 -0
  123. package/dist/server/services/schema-builder/content-type-builder.js +31 -1
  124. package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
  125. package/dist/server/services/schema-builder/content-type-builder.mjs +31 -1
  126. package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
  127. package/dist/server/services/schema-mutation.js +30 -2
  128. package/dist/server/services/schema-mutation.js.map +1 -1
  129. package/dist/server/services/schema-mutation.mjs +10 -2
  130. package/dist/server/services/schema-mutation.mjs.map +1 -1
  131. package/dist/server/services/schema.js +259 -15
  132. package/dist/server/services/schema.js.map +1 -1
  133. package/dist/server/services/schema.mjs +252 -9
  134. package/dist/server/services/schema.mjs.map +1 -1
  135. package/dist/server/src/config.d.ts +23 -2
  136. package/dist/server/src/config.d.ts.map +1 -1
  137. package/dist/server/src/controllers/validation/content-type.d.ts +0 -1
  138. package/dist/server/src/controllers/validation/content-type.d.ts.map +1 -1
  139. package/dist/server/src/controllers/validation/relations.d.ts.map +1 -1
  140. package/dist/server/src/controllers/validation/schema.d.ts +28 -0
  141. package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
  142. package/dist/server/src/index.d.ts +10 -2
  143. package/dist/server/src/index.d.ts.map +1 -1
  144. package/dist/server/src/services/content-types.d.ts.map +1 -1
  145. package/dist/server/src/services/migration-builder/index.d.ts +83 -0
  146. package/dist/server/src/services/migration-builder/index.d.ts.map +1 -0
  147. package/dist/server/src/services/schema-builder/content-type-builder.d.ts.map +1 -1
  148. package/dist/server/src/services/schema-mutation.d.ts +4 -2
  149. package/dist/server/src/services/schema-mutation.d.ts.map +1 -1
  150. package/dist/server/src/services/schema.d.ts +19 -0
  151. package/dist/server/src/services/schema.d.ts.map +1 -1
  152. package/package.json +11 -10
@@ -1 +1 @@
1
- {"version":3,"file":"reducer.js","sources":["../../../../admin/src/components/DataManager/reducer.ts"],"sourcesContent":["import { PayloadAction } from '@reduxjs/toolkit';\nimport merge from 'lodash/merge';\nimport omit from 'lodash/omit';\n\nimport { applyPrivateSearchDefault } from '../../utils/applyPrivateSearchDefault';\nimport { getRelationType } from '../../utils/getRelationType';\nimport { makeUnique } from '../../utils/makeUnique';\n\nimport { createUndoRedoSlice } from './undoRedo';\nimport {\n createEmptyContentStructure,\n findSiblingFolderByName,\n getDeleteFolderOnlySiblingNameCollisions,\n isFolderNameTakenBySibling,\n MAX_FOLDER_DEPTH,\n sectionKeyForKind,\n} from './utils/contentStructure';\n\nimport type {\n Components,\n ContentTypes,\n ContentType,\n Component,\n Status,\n AnyAttribute,\n} from '../../types';\nimport type {\n ContentStructure,\n ContentStructureGroup,\n ContentStructureSection,\n GroupStatus,\n SectionKey,\n} from './utils/contentStructure';\nimport type { Internal, Schema, Struct, UID } from '@strapi/types';\n\nexport interface DataManagerStateType {\n components: Components;\n initialComponents: Components;\n contentTypes: ContentTypes;\n initialContentTypes: ContentTypes;\n contentStructure: ContentStructure;\n initialContentStructure: ContentStructure;\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n isLoading: boolean;\n [key: string]: unknown;\n}\n\nconst initialState: DataManagerStateType = {\n components: {},\n contentTypes: {},\n initialComponents: {},\n initialContentTypes: {},\n contentStructure: createEmptyContentStructure(),\n initialContentStructure: createEmptyContentStructure(),\n reservedNames: {\n models: [],\n attributes: [],\n },\n isLoading: true,\n};\n\nconst ONE_SIDE_RELATIONS = ['oneWay', 'manyWay'];\n\ntype AttributeMutation = AnyAttribute & {\n createComponent?: unknown;\n};\n\ntype PluginOptions = Record<string, unknown>;\n\nconst getOppositeRelation = (originalRelation?: Schema.Attribute.RelationKind.Any) => {\n if (originalRelation === 'manyToOne') {\n return 'oneToMany';\n }\n\n if (originalRelation === 'oneToMany') {\n return 'manyToOne';\n }\n\n return originalRelation;\n};\n\nconst findAttributeIndex = (type: ContentType | Component, attributeToFind?: string) => {\n return type.attributes.findIndex(({ name }: { name: string }) => name === attributeToFind);\n};\n\ntype InitPayload = {\n components: Record<string, Component>;\n contentTypes: Record<string, ContentType>;\n reservedNames: DataManagerStateType['reservedNames'];\n contentStructure?: ContentStructure;\n};\n\ntype CreateFolderPayload = {\n parentId: string | null;\n section: SectionKey;\n name: string;\n id: string;\n};\n\ntype RenameFolderPayload = {\n section: SectionKey;\n name: string;\n id: string;\n};\n\ntype MoveFolderPayload = {\n newParentId: string | null;\n section: SectionKey;\n index?: number;\n id: string;\n};\n\ntype DeleteFolderPayload = {\n section: SectionKey;\n id: string;\n};\n\ntype DeleteFolderAndContentPayload = DeleteFolderPayload & {\n contentTypeUids: Internal.UID.ContentType[];\n};\n\ntype AssignContentTypeToFolderPayload = {\n targetGroupId: string | null;\n uid: UID.ContentType;\n section: SectionKey;\n index?: number;\n};\n\ntype ReorderFolderChildrenPayload = {\n section: SectionKey;\n groupId: string;\n from: number;\n to: number;\n};\n\ntype AddAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype AddCreateComponentToDynamicZonePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n};\n\ntype AddCustomFieldAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype ChangeDynamicZoneComponentsPayload = {\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype CreateComponentSchemaPayload = {\n uid: string;\n data: {\n icon?: string;\n displayName: string;\n };\n componentCategory: string;\n};\n\ntype FolderAssignmentPayload =\n | { targetGroupId: string | null }\n | { newFolderId: string; newFolderName: string };\n\ntype CreateSchemaPayload = {\n uid: string;\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: PluginOptions;\n };\n folder?: FolderAssignmentPayload;\n};\n\ntype EditAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n name: string;\n};\n\ntype EditCustomFieldAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n name: string;\n};\n\ntype RemoveComponentFromDynamicZonePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n dzName: string;\n componentToRemoveIndex: number;\n};\n\ntype RemoveFieldPayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n attributeToRemoveName: string;\n};\n\ntype UpdateComponentSchemaPayload = {\n data: {\n icon?: string;\n displayName: string;\n };\n uid: Internal.UID.Component;\n};\n\ntype UpdateComponentUIDPayload = {\n uid: Internal.UID.Component;\n newComponentUID: Internal.UID.Component;\n};\n\ntype UpdateSchemaPayload = {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: PluginOptions;\n };\n uid: string;\n folder?: FolderAssignmentPayload;\n};\n\ntype MoveAttributePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n from: number;\n to: number;\n};\n\nconst getType = (\n state: DataManagerStateType,\n {\n forTarget,\n targetUid,\n }: {\n forTarget: Struct.ModelType;\n targetUid: string;\n }\n) => {\n return forTarget === 'contentType' ? state.contentTypes[targetUid] : state.components[targetUid];\n};\n\n// TODO: use initial state when chnaging back to the initial state without knowing\nconst setStatus = (type: ContentType | Component, status: Status) => {\n switch (type.status) {\n case 'NEW':\n case 'REMOVED': {\n break;\n }\n default: {\n type.status = status;\n }\n }\n};\n\nconst getNewStatus = (oldStatus: Status | undefined, newStatus: Status) => {\n if (oldStatus === 'NEW' || oldStatus === 'REMOVED') {\n return oldStatus;\n }\n\n return newStatus;\n};\n\nconst getNewGroupStatus = (oldStatus: GroupStatus, newStatus: GroupStatus): GroupStatus => {\n if (oldStatus === 'NEW') {\n return oldStatus;\n }\n\n return newStatus;\n};\n\nconst setAttributeStatus = (attribute: { status?: Status }, status: Status) => {\n attribute.status = getNewStatus(attribute.status, status);\n};\n\nconst createAttribute = (properties: Record<string, unknown>): AnyAttribute => {\n return {\n ...applyPrivateSearchDefault(properties),\n status: 'NEW',\n } as AnyAttribute;\n};\n\nconst setAttributeAt = (type: ContentType | Component, index: number, attribute: AnyAttribute) => {\n const previousAttribute = type.attributes[index];\n\n const newStatus = getNewStatus(previousAttribute.status, 'CHANGED');\n\n type.attributes[index] = {\n ...applyPrivateSearchDefault(attribute),\n status: newStatus,\n };\n\n setStatus(type, 'CHANGED');\n};\n\nconst pushAttribute = (type: ContentType | Component, attribute: AnyAttribute) => {\n type.attributes.push(attribute);\n setStatus(type, 'CHANGED');\n};\n\nconst removeAttributeAt = (type: ContentType | Component, index: number) => {\n const attr = type.attributes[index];\n\n setStatus(type, 'CHANGED');\n\n if (attr.status === 'NEW') {\n type.attributes.splice(index, 1);\n } else {\n setAttributeStatus(attr, 'REMOVED');\n }\n};\n\nconst replaceAttributeAt = (\n type: ContentType | Component,\n index: number,\n attribute: AnyAttribute\n) => {\n type.attributes[index] = attribute;\n setStatus(type, 'CHANGED');\n};\n\nconst removeAttributeByName = (type: ContentType | Component, name: string) => {\n const idx = type.attributes.findIndex((attr) => attr.name === name);\n\n if (idx === -1) {\n return;\n }\n\n const attr = type.attributes[idx];\n\n setStatus(type, 'CHANGED');\n\n if (attr.status === 'NEW') {\n type.attributes.splice(idx, 1);\n } else {\n setAttributeStatus(attr, 'REMOVED');\n }\n};\n\nconst updateType = (type: ContentType | Component, data: Record<string, unknown>) => {\n merge(type, data);\n setStatus(type, 'CHANGED');\n};\n\nconst findGroup = (groups: ContentStructureGroup[], id: string) => {\n return groups.find((group) => group.id === id);\n};\n\nconst setGroupStatus = (group: ContentStructureGroup, status: GroupStatus): void => {\n group.status = getNewGroupStatus(group.status, status);\n};\n\n/**\n * Remove a content type reference from every group of a section, mark the group as changed if a reference was removed.\n * @returns true if a reference was removed, false otherwise.\n */\nconst removeContentTypeChild = (groups: ContentStructureGroup[], uid: string): boolean => {\n let removed = false;\n\n for (const group of groups) {\n const groupIndex = group.children.findIndex((child) => {\n return child.type === 'contentType' && child.uid === uid;\n });\n\n if (groupIndex !== -1) {\n group.children.splice(groupIndex, 1);\n setGroupStatus(group, 'CHANGED');\n removed = true;\n }\n }\n\n return removed;\n};\n\n/**\n * Assign a content type to a folder within a single section, optionally creating\n * a new root folder first.\n *\n * Detaches the content type from any current folder then files it under the target group.\n * This is also used by the create/edit content-type modal's folder picker via\n * createSchema/updateSchema.\n */\nconst applyFolderAssignment = (\n section: ContentStructureSection,\n uid: UID.ContentType,\n folder: FolderAssignmentPayload\n): void => {\n const { groups } = section;\n\n removeContentTypeChild(groups, uid);\n\n let targetGroupId: string | null;\n\n if ('newFolderId' in folder) {\n // Reuse an existing root folder of the same name instead of creating a\n // duplicate. The modal picker can only ever makes root folders, so\n // this makes the assumption that a same-named root folder means the\n // user wants to insert into that folder.\n const existing = findSiblingFolderByName(groups, null, folder.newFolderName);\n\n if (existing) {\n targetGroupId = existing.id;\n } else {\n groups.push({\n name: folder.newFolderName.trim(),\n id: folder.newFolderId,\n parent: null,\n children: [],\n status: 'NEW',\n });\n\n targetGroupId = folder.newFolderId;\n }\n } else {\n targetGroupId = folder.targetGroupId;\n }\n\n if (!targetGroupId) {\n return;\n }\n\n const targetGroup = findGroup(groups, targetGroupId);\n\n if (targetGroup) {\n targetGroup.children.push({ type: 'contentType', uid });\n setGroupStatus(targetGroup, 'CHANGED');\n }\n};\n\n/**\n * Determines whether `potentialDescendantId` is nested somewhere inside `ancestorId`'s subtree\n */\nconst isDescendantGroup = (\n groups: ContentStructureGroup[],\n ancestorId: string,\n potentialDescendantId: string\n): boolean => {\n let current = findGroup(groups, potentialDescendantId);\n\n while (current && current.parent !== null) {\n if (current.parent === ancestorId) {\n return true;\n }\n\n current = findGroup(groups, current.parent);\n }\n\n return false;\n};\n\nconst getGroupDepth = (groups: ContentStructureGroup[], id: string): number => {\n let depth = 1;\n let current = findGroup(groups, id);\n\n while (current && current.parent !== null) {\n current = findGroup(groups, current.parent);\n depth += 1;\n }\n\n return depth;\n};\n\n/**\n * Number of folder levels below a group e.g. a group with no sub-folders has height 0.\n */\nconst getSubtreeHeight = (groups: ContentStructureGroup[], id: string): number => {\n const group = findGroup(groups, id);\n\n if (!group) {\n return 0;\n }\n\n let height = 0;\n\n for (const child of group.children) {\n if (child.type !== 'group') continue;\n height = Math.max(height, 1 + getSubtreeHeight(groups, child.id));\n }\n\n return height;\n};\n\nconst applyDeleteContentType = (state: DataManagerStateType, uid: Internal.UID.ContentType) => {\n const type = state.contentTypes[uid];\n\n // Only application schemas belong to CTB. Folder actions can be crafted outside the UI,\n // so this guard must live at the mutation boundary rather than in the dialog alone.\n if (!type || !type.uid.startsWith('api::') || type.plugin) {\n return;\n }\n\n // just drop new content types\n if (type.status === 'NEW') {\n delete state.contentTypes[uid];\n } else {\n setStatus(type, 'REMOVED');\n }\n\n // remove the content type from the content structure tree\n Object.values(state.contentStructure.sections).forEach((section) => {\n removeContentTypeChild(section.groups, uid);\n });\n\n // remove the content type from the components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n const namesToRemove = component.attributes\n .filter((attribute) => attribute.type === 'relation' && attribute.target === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(component, name);\n });\n });\n\n // remove the content type from the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n const namesToRemove = contentType.attributes\n .filter((attribute) => attribute.type === 'relation' && attribute.target === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(contentType, name);\n });\n });\n};\n\nconst slice = createUndoRedoSlice(\n {\n name: 'data-manager',\n initialState,\n reducers: {\n init: (state, action: PayloadAction<InitPayload>) => {\n const { components, contentTypes, reservedNames, contentStructure } = action.payload;\n\n state.components = components;\n state.initialComponents = components;\n state.initialContentTypes = contentTypes;\n state.contentTypes = contentTypes;\n state.reservedNames = reservedNames;\n\n const structure = contentStructure ?? createEmptyContentStructure();\n state.initialContentStructure = structure;\n state.contentStructure = structure;\n\n state.isLoading = false;\n },\n createComponentSchema: (state, action: PayloadAction<CreateComponentSchemaPayload>) => {\n const { uid, data, componentCategory } = action.payload;\n\n const newSchema: Component = {\n uid: uid as Internal.UID.Component,\n status: 'NEW',\n category: componentCategory,\n modelName: data.displayName,\n globalId: data.displayName,\n info: {\n icon: data.icon,\n displayName: data.displayName,\n },\n attributes: [],\n modelType: 'component',\n };\n\n state.components[uid as string] = newSchema;\n },\n createSchema: (state, action: PayloadAction<CreateSchemaPayload>) => {\n const { uid, data, folder } = action.payload;\n\n const { displayName, singularName, pluralName, kind, draftAndPublish, pluginOptions } =\n data;\n\n const newSchema: ContentType = {\n uid: uid as Internal.UID.ContentType,\n status: 'NEW',\n visible: true,\n modelType: 'contentType',\n restrictRelationsTo: null,\n attributes: [],\n kind,\n modelName: displayName,\n globalId: displayName,\n options: {\n draftAndPublish,\n },\n info: {\n displayName,\n singularName,\n pluralName,\n },\n pluginOptions,\n };\n\n state.contentTypes[uid] = newSchema;\n\n // File the new content type into a folder in the same transaction it is created,\n // so both are subject to the same undo/redo operatiion.\n if (folder) {\n applyFolderAssignment(\n state.contentStructure.sections[sectionKeyForKind(kind)],\n uid as UID.ContentType,\n folder\n );\n }\n },\n addAttribute: (state, action: PayloadAction<AddAttributePayload>) => {\n const { attributeToSet, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attribute = createAttribute(omit(attributeToSet, 'createComponent'));\n\n if (attribute.type === 'relation') {\n const target = attribute.target;\n const targetAttribute = attribute.targetAttribute || null;\n const relation = attribute.relation;\n const relationType = getRelationType(relation, targetAttribute);\n\n const isBidirectionalRelation =\n relationType !== undefined && !['oneWay', 'manyWay'].includes(relationType);\n\n if (isBidirectionalRelation) {\n const oppositeAttribute = createAttribute({\n name: targetAttribute,\n relation: getOppositeRelation(relationType),\n target: type.uid,\n targetAttribute: attribute.name,\n type: 'relation',\n private: attribute.private,\n });\n\n const targetType = getType(state, { forTarget, targetUid: target });\n pushAttribute(targetType, oppositeAttribute);\n }\n }\n\n pushAttribute(type, attribute);\n setStatus(type, 'CHANGED');\n },\n moveAttribute: (state, action: PayloadAction<MoveAttributePayload>) => {\n const { forTarget, targetUid, from, to } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attribute = type.attributes[from];\n type.attributes.splice(from, 1);\n type.attributes.splice(to, 0, attribute);\n setStatus(type, 'CHANGED');\n },\n addCustomFieldAttribute: (state, action: PayloadAction<AddCustomFieldAttributePayload>) => {\n const { attributeToSet, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n pushAttribute(type, createAttribute(attributeToSet));\n },\n addCreatedComponentToDynamicZone: (\n state,\n action: PayloadAction<AddCreateComponentToDynamicZonePayload>\n ) => {\n const { dynamicZoneTarget, componentsToAdd, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const dzAttributeIndex = findAttributeIndex(type, dynamicZoneTarget);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n\n componentsToAdd.forEach((componentUid: Internal.UID.Component) => {\n attr.components.push(componentUid);\n });\n\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n setStatus(type, 'CHANGED');\n },\n changeDynamicZoneComponents: (\n state,\n action: PayloadAction<ChangeDynamicZoneComponentsPayload>\n ) => {\n const { dynamicZoneTarget, newComponents, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const dzAttributeIndex = findAttributeIndex(type, dynamicZoneTarget);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n const currentDZComponents = attr.components;\n\n const updatedComponents = makeUnique([...currentDZComponents, ...newComponents]);\n\n setStatus(type, 'CHANGED');\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n attr.components = updatedComponents;\n },\n editAttribute: (state, action: PayloadAction<EditAttributePayload>) => {\n const { name, attributeToSet, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const initialAttributeIndex = findAttributeIndex(type, name);\n\n if (initialAttributeIndex === -1) {\n return;\n }\n\n const previousAttribute = type.attributes[initialAttributeIndex];\n\n setAttributeAt(type, initialAttributeIndex, attributeToSet as AnyAttribute);\n\n if (previousAttribute.type !== attributeToSet.type) {\n return;\n }\n\n if (previousAttribute.type !== 'relation' || attributeToSet.type !== 'relation') {\n return;\n }\n\n const previousTarget = getType(state, {\n forTarget: 'contentType',\n targetUid: previousAttribute.target,\n });\n const newTarget = getType(state, {\n forTarget: 'contentType',\n targetUid: attributeToSet.target,\n });\n\n const previousTargetAttributeIndex = findAttributeIndex(\n previousTarget,\n previousAttribute.targetAttribute ?? ''\n );\n const previousTargetAttribute =\n previousTargetAttributeIndex !== -1\n ? previousTarget.attributes[previousTargetAttributeIndex]\n : undefined;\n\n // remove old targetAttribute\n if (previousAttribute.targetAttribute) {\n removeAttributeByName(previousTarget, previousAttribute.targetAttribute);\n }\n\n const newRelationType = getRelationType(\n attributeToSet.relation,\n attributeToSet.targetAttribute\n );\n const isBidirectionnal =\n newRelationType !== undefined && !ONE_SIDE_RELATIONS.includes(newRelationType);\n\n if (isBidirectionnal) {\n const newTargetAttribute = {\n name: attributeToSet.targetAttribute,\n type: 'relation',\n relation: getOppositeRelation(attributeToSet.relation),\n targetAttribute: attributeToSet.name,\n target: type.uid,\n private: previousAttribute.private ?? attributeToSet.private,\n pluginOptions: previousAttribute.pluginOptions ?? attributeToSet.pluginOptions,\n ...(previousTarget.uid === newTarget.uid && previousTargetAttribute?.conditions\n ? { conditions: previousTargetAttribute.conditions }\n : {}),\n status: 'CHANGED',\n } as AnyAttribute;\n\n // create or recreate(at old index) targetAttribute\n if (previousTargetAttributeIndex !== -1 && previousTarget.uid === newTarget.uid) {\n // re-create at previousIdx if possible\n replaceAttributeAt(newTarget, previousTargetAttributeIndex, newTargetAttribute);\n } else {\n pushAttribute(newTarget, {\n ...newTargetAttribute,\n status: 'NEW',\n });\n }\n }\n },\n editCustomFieldAttribute: (state, action: PayloadAction<EditCustomFieldAttributePayload>) => {\n const { forTarget, targetUid, name, attributeToSet } = action.payload;\n\n const initialAttributeName = name;\n const type = getType(state, { forTarget, targetUid });\n\n const initialAttributeIndex = findAttributeIndex(type, initialAttributeName);\n\n setAttributeAt(type, initialAttributeIndex, attributeToSet as AnyAttribute);\n },\n reloadPlugin: () => {\n return initialState;\n },\n removeComponentFromDynamicZone: (\n state,\n action: PayloadAction<RemoveComponentFromDynamicZonePayload>\n ) => {\n const { dzName, componentToRemoveIndex, forTarget, targetUid } = action.payload;\n\n const type =\n forTarget === 'contentType' ? state.contentTypes[targetUid] : state.components[targetUid];\n\n if (!type) {\n return;\n }\n\n const dzAttributeIndex = findAttributeIndex(type, dzName);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n\n setStatus(type, 'CHANGED');\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n attr.components.splice(componentToRemoveIndex, 1);\n },\n removeField: (state, action: PayloadAction<RemoveFieldPayload>) => {\n const { forTarget, targetUid, attributeToRemoveName } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attributeToRemoveIndex = findAttributeIndex(type, attributeToRemoveName);\n const attribute = type.attributes[attributeToRemoveIndex];\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute: targetAttributeName } = attribute;\n const relationType = getRelationType(relation, targetAttributeName);\n\n const isBidirectionnal = !ONE_SIDE_RELATIONS.includes(relationType!);\n\n if (isBidirectionnal && targetAttributeName) {\n const targetContentType = getType(state, { forTarget, targetUid: target });\n const targetAttributeIndex = findAttributeIndex(targetContentType, targetAttributeName);\n\n removeAttributeAt(targetContentType, targetAttributeIndex);\n }\n }\n\n // Find all uid fields that have the targetField set to the field we are removing\n type.attributes.forEach((attribute) => {\n if (attribute.type === 'uid') {\n if (attribute.targetField === attributeToRemoveName) {\n delete attribute.targetField;\n }\n }\n });\n\n removeAttributeAt(type, attributeToRemoveIndex);\n },\n // only edits a component in practice\n updateComponentSchema: (state, action: PayloadAction<UpdateComponentSchemaPayload>) => {\n const { data, uid } = action.payload;\n\n const type = state.components[uid];\n if (!type) {\n return;\n }\n\n updateType(type, {\n info: {\n displayName: data.displayName,\n icon: data.icon,\n },\n });\n },\n updateComponentUid: (state, action: PayloadAction<UpdateComponentUIDPayload>) => {\n const { newComponentUID, uid } = action.payload;\n\n const type = state.components[uid];\n if (!type || type.status !== 'NEW') {\n return;\n }\n\n if (newComponentUID !== uid) {\n const newType = { ...type, uid: newComponentUID };\n state.components[newComponentUID] = newType;\n delete state.components[uid];\n\n // update the uid in the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'dynamiczone') {\n const newComponents = attribute.components.map((component: UID.Component) => {\n if (component === uid) {\n return newComponentUID;\n }\n\n return component;\n });\n\n attribute.components = newComponents;\n }\n });\n\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'component' && attribute.component === uid) {\n attribute.component = newComponentUID;\n }\n });\n });\n\n // update the uid in the other components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n component.attributes.forEach((attribute) => {\n if (attribute.type === 'component' && attribute.component === uid) {\n attribute.component = newComponentUID;\n }\n });\n });\n }\n },\n updateSchema: (state, action: PayloadAction<UpdateSchemaPayload>) => {\n const { data, uid, folder } = action.payload;\n\n const { displayName, kind, draftAndPublish, pluginOptions } = data;\n\n const type = state.contentTypes[uid];\n if (!type) {\n return;\n }\n\n const previousKind = type.kind;\n\n updateType(type, {\n info: {\n displayName,\n },\n kind,\n options: {\n draftAndPublish,\n },\n pluginOptions,\n });\n\n if (kind && kind !== previousKind) {\n const oldSection = state.contentStructure.sections[sectionKeyForKind(previousKind)];\n removeContentTypeChild(oldSection.groups, uid);\n }\n\n // Apply the folder picker's choice after any kind relocation, so the\n // assignment lands in the content type's (possibly new) section.\n if (folder) {\n applyFolderAssignment(\n state.contentStructure.sections[sectionKeyForKind(kind)],\n uid as UID.ContentType,\n folder\n );\n }\n },\n deleteComponent: (state, action: PayloadAction<Internal.UID.Component>) => {\n const uid = action.payload;\n\n // remove the compo from the components\n if (state.components[uid].status === 'NEW') {\n delete state.components[uid];\n } else {\n setStatus(state.components[uid], 'REMOVED');\n }\n\n // remove the compo from the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n // remove from dynamic zones\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'dynamiczone') {\n const newComponents = attribute.components.filter(\n (component: unknown) => component !== uid\n );\n\n attribute.components = newComponents;\n }\n });\n\n const namesToRemove = contentType.attributes\n .filter((attribute) => attribute.type === 'component' && attribute.component === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(contentType, name);\n });\n });\n\n // remove the compo from other components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n const namesToRemove = component.attributes\n .filter((attribute) => attribute.type === 'component' && attribute.component === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(component, name);\n });\n });\n },\n deleteContentType: (state, action: PayloadAction<Internal.UID.ContentType>) => {\n applyDeleteContentType(state, action.payload);\n },\n\n createFolder: (state, action: PayloadAction<CreateFolderPayload>) => {\n const { section, id, name: rawName, parentId } = action.payload;\n const name = rawName.trim();\n const { groups } = state.contentStructure.sections[section];\n\n if (parentId && getGroupDepth(groups, parentId) + 1 > MAX_FOLDER_DEPTH) {\n return;\n }\n\n if (isFolderNameTakenBySibling(groups, parentId, name)) {\n return;\n }\n\n groups.push({ id, name, parent: parentId, children: [], status: 'NEW' });\n\n if (parentId) {\n const parent = findGroup(groups, parentId);\n\n if (parent) {\n parent.children.push({ type: 'group', id });\n setGroupStatus(parent, 'CHANGED');\n }\n }\n },\n renameFolder: (state, action: PayloadAction<RenameFolderPayload>) => {\n const { section, id, name: rawName } = action.payload;\n const name = rawName.trim();\n\n const { groups } = state.contentStructure.sections[section];\n const group = findGroup(groups, id);\n if (!group) {\n return;\n }\n\n if (group.name === name) {\n return;\n }\n\n if (isFolderNameTakenBySibling(groups, group.parent, name, id)) {\n return;\n }\n\n group.name = name;\n setGroupStatus(group, 'CHANGED');\n },\n moveFolder: (state, action: PayloadAction<MoveFolderPayload>) => {\n const { section, id, newParentId, index } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n const group = findGroup(groups, id);\n if (!group) {\n return;\n }\n\n // Reject no-ops and cyclic moves\n if (newParentId === id || (newParentId && isDescendantGroup(groups, id, newParentId))) {\n return;\n }\n\n // Refuse moves that would exceed the maximum allowed depth.\n const newTopDepth = newParentId ? getGroupDepth(groups, newParentId) + 1 : 1;\n if (newTopDepth + getSubtreeHeight(groups, id) > MAX_FOLDER_DEPTH) {\n return;\n }\n\n // Refuse a move that would collide with an identically named sibling.\n if (isFolderNameTakenBySibling(groups, newParentId, group.name, id)) {\n return;\n }\n\n if (group.parent) {\n const oldParent = findGroup(groups, group.parent);\n\n if (oldParent) {\n // Remove from the old parent's list of children.\n const idx = oldParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === id;\n });\n\n if (idx !== -1) {\n oldParent.children.splice(idx, 1);\n }\n\n setGroupStatus(oldParent, 'CHANGED');\n }\n }\n\n group.parent = newParentId;\n setGroupStatus(group, 'CHANGED');\n\n if (newParentId) {\n const newParent = findGroup(groups, newParentId);\n\n if (newParent) {\n const entry = { type: 'group' as const, id };\n\n if (typeof index === 'number' && index >= 0 && index <= newParent.children.length) {\n newParent.children.splice(index, 0, entry);\n } else {\n newParent.children.push(entry);\n }\n\n setGroupStatus(newParent, 'CHANGED');\n }\n } else if (typeof index === 'number') {\n // If a content type is dropped into the root:\n // The root display order follows the array order of the\n // section's root-level groups because there's no root level\n // customization yet, so reposition the moved group among them.\n const currentIndex = groups.findIndex((candidate) => candidate.id === id);\n\n if (currentIndex !== -1) {\n const [moved] = groups.splice(currentIndex, 1);\n const rootIds = groups\n .filter((candidate) => candidate.parent === null)\n .map((candidate) => candidate.id);\n const anchorId = rootIds[index];\n const insertAt = anchorId\n ? groups.findIndex((candidate) => candidate.id === anchorId)\n : groups.length;\n\n groups.splice(insertAt === -1 ? groups.length : insertAt, 0, moved);\n }\n }\n },\n deleteFolderOnly: (state, action: PayloadAction<DeleteFolderPayload>) => {\n const { section, id: groupToDeleteId } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n const groupToDelete = findGroup(groups, groupToDeleteId);\n if (!groupToDelete) {\n return;\n }\n\n const groupToDeleteParentId = groupToDelete.parent;\n\n // Reparenting a child folder into its grandparent must preserve the same sibling-name\n // invariant as create, rename, and move. Do this before mutating any group state.\n if (getDeleteFolderOnlySiblingNameCollisions(groups, groupToDeleteId).length > 0) {\n return;\n }\n\n // It is necessary to clone the children because we must subsequently mutate the original group.children array when we splice it out of its parent.\n const children = groupToDelete.children.map((child) => ({ ...child }));\n\n // Children of a deleted folder inherit the deleted folder's parent.\n children.forEach((child) => {\n if (child.type === 'group') {\n const childGroup = findGroup(groups, child.id);\n\n if (childGroup) {\n childGroup.parent = groupToDeleteParentId;\n }\n }\n });\n\n if (groupToDeleteParentId) {\n const groupToDeleteParent = findGroup(groups, groupToDeleteParentId);\n\n if (groupToDeleteParent) {\n // Splice the deleted folder's children of the deleted folder into their new parent at the position of the deleted folder.\n const groupToDeleteIndex = groupToDeleteParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === groupToDeleteId;\n });\n\n if (groupToDeleteIndex !== -1) {\n groupToDeleteParent.children.splice(groupToDeleteIndex, 1, ...children);\n } else {\n groupToDeleteParent.children.push(...children);\n }\n\n setGroupStatus(groupToDeleteParent, 'CHANGED');\n }\n }\n\n // Finally, remove the deleted folder from its section's list of groups.\n const groupIndex = groups.findIndex((candidate) => {\n return candidate.id === groupToDeleteId;\n });\n\n if (groupIndex !== -1) {\n groups.splice(groupIndex, 1);\n }\n },\n deleteFolderAndContent: (state, action: PayloadAction<DeleteFolderAndContentPayload>) => {\n const { section, id: groupToDeleteId, contentTypeUids } = action.payload;\n\n contentTypeUids.forEach((uid) => {\n applyDeleteContentType(state, uid);\n });\n\n const { groups } = state.contentStructure.sections[section];\n\n const groupToDelete = findGroup(groups, groupToDeleteId);\n if (!groupToDelete) {\n return;\n }\n\n const toRemove = new Set<string>();\n const collect = (currentGroupId: string) => {\n toRemove.add(currentGroupId);\n\n const currentGroup = findGroup(groups, currentGroupId);\n\n for (const child of currentGroup?.children ?? []) {\n if (child.type !== 'group') continue;\n collect(child.id);\n }\n };\n\n collect(groupToDeleteId);\n\n if (groupToDelete.parent) {\n const groupToDeleteParent = findGroup(groups, groupToDelete.parent);\n\n if (groupToDeleteParent) {\n const groupToDeleteIndex = groupToDeleteParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === groupToDeleteId;\n });\n\n if (groupToDeleteIndex !== -1) {\n groupToDeleteParent.children.splice(groupToDeleteIndex, 1);\n }\n\n setGroupStatus(groupToDeleteParent, 'CHANGED');\n }\n }\n\n // Removes the group entry and all its descendants from the contentStructure.\n state.contentStructure.sections[section].groups = groups.filter((candidate) => {\n return !toRemove.has(candidate.id);\n });\n },\n assignContentTypeToFolder: (\n state,\n action: PayloadAction<AssignContentTypeToFolderPayload>\n ) => {\n const { section, uid, targetGroupId, index } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n removeContentTypeChild(groups, uid);\n\n if (targetGroupId) {\n const targetGroup = findGroup(groups, targetGroupId);\n\n if (targetGroup) {\n const entry = { type: 'contentType' as const, uid };\n\n if (typeof index === 'number' && index >= 0 && index <= targetGroup.children.length) {\n targetGroup.children.splice(index, 0, entry);\n } else {\n targetGroup.children.push(entry);\n }\n\n setGroupStatus(targetGroup, 'CHANGED');\n }\n }\n },\n reorderFolderChildren: (state, action: PayloadAction<ReorderFolderChildrenPayload>) => {\n const { section, groupId, from, to } = action.payload;\n\n const group = findGroup(state.contentStructure.sections[section].groups, groupId);\n if (!group) {\n return;\n }\n\n const child = group.children[from];\n if (!child) {\n return;\n }\n\n group.children.splice(from, 1);\n group.children.splice(to, 0, child);\n\n setGroupStatus(group, 'CHANGED');\n },\n\n applyChange(\n state,\n reducerAction: PayloadAction<{\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }>\n ) {\n const { action, schema } = reducerAction.payload;\n\n switch (action) {\n case 'add':\n {\n const uid = schema.uid;\n\n if (schema.modelType === 'component') {\n state.components[uid] = schema;\n } else {\n state.contentTypes[uid] = schema;\n }\n }\n break;\n case 'update':\n {\n const uid = schema.uid;\n\n // Find the schema, if the state was \"create\", we should keep it as it was before\n\n if (schema.modelType === 'component') {\n const component = state.components[uid];\n state.components[uid] = {\n ...schema,\n status: component?.status === 'NEW' ? 'NEW' : schema.status,\n };\n } else {\n const contentType = state.contentTypes[uid];\n const previousKind = contentType?.kind;\n\n state.contentTypes[uid] = {\n ...schema,\n status: contentType?.status === 'NEW' ? 'NEW' : schema.status,\n };\n\n if (previousKind && schema.kind && schema.kind !== previousKind) {\n const oldSection =\n state.contentStructure.sections[sectionKeyForKind(previousKind)];\n removeContentTypeChild(oldSection.groups, uid);\n }\n }\n }\n break;\n case 'delete': {\n const uid = schema.uid;\n const isComponent = schema.modelType === 'component';\n // It's a component that has yet not been added\n if (isComponent) {\n const exists = state.components[uid];\n if (!exists) {\n return;\n }\n\n const isUnsaved = state.components[uid]?.status === 'NEW';\n if (isUnsaved) {\n delete state.components[uid];\n } else {\n state.components[uid].status = 'REMOVED';\n }\n } else {\n const exists = state.contentTypes[uid];\n if (!exists) {\n return;\n }\n\n const isUnsaved = state.contentTypes[uid]?.status === 'NEW';\n if (isUnsaved) {\n delete state.contentTypes[uid];\n } else {\n state.contentTypes[uid].status = 'REMOVED';\n }\n\n Object.values(state.contentStructure.sections).forEach((section) => {\n removeContentTypeChild(section.groups, uid);\n });\n }\n\n break;\n }\n }\n },\n },\n },\n\n {\n limit: 50,\n excludeActionsFromHistory: ['reloadPlugin', 'init'],\n stateSelector: (state) => {\n if (!state) {\n return {};\n }\n\n return {\n components: state.components,\n contentTypes: state.contentTypes,\n contentStructure: state.contentStructure,\n };\n },\n discard: (state) => {\n state.components = state.initialComponents;\n state.contentTypes = state.initialContentTypes;\n state.contentStructure = state.initialContentStructure;\n },\n }\n);\n\nexport type State = ReturnType<typeof slice.reducer>;\nexport const { reducer, actions } = slice;\nexport { initialState };\n"],"names":["initialState","components","contentTypes","initialComponents","initialContentTypes","contentStructure","createEmptyContentStructure","initialContentStructure","reservedNames","models","attributes","isLoading","ONE_SIDE_RELATIONS","getOppositeRelation","originalRelation","findAttributeIndex","type","attributeToFind","findIndex","name","getType","state","forTarget","targetUid","setStatus","status","getNewStatus","oldStatus","newStatus","getNewGroupStatus","setAttributeStatus","attribute","createAttribute","properties","applyPrivateSearchDefault","setAttributeAt","index","previousAttribute","pushAttribute","push","removeAttributeAt","attr","splice","replaceAttributeAt","removeAttributeByName","idx","updateType","data","merge","findGroup","groups","id","find","group","setGroupStatus","removeContentTypeChild","uid","removed","groupIndex","children","child","applyFolderAssignment","section","folder","targetGroupId","existing","findSiblingFolderByName","newFolderName","trim","newFolderId","parent","targetGroup","isDescendantGroup","ancestorId","potentialDescendantId","current","getGroupDepth","depth","getSubtreeHeight","height","Math","max","applyDeleteContentType","startsWith","plugin","Object","values","sections","forEach","keys","componentUid","component","namesToRemove","filter","target","map","contentTypeUid","contentType","slice","createUndoRedoSlice","reducers","init","action","payload","structure","createComponentSchema","componentCategory","newSchema","category","modelName","displayName","globalId","info","icon","modelType","createSchema","singularName","pluralName","kind","draftAndPublish","pluginOptions","visible","restrictRelationsTo","options","sectionKeyForKind","addAttribute","attributeToSet","omit","targetAttribute","relation","relationType","getRelationType","isBidirectionalRelation","undefined","includes","oppositeAttribute","private","targetType","moveAttribute","from","to","addCustomFieldAttribute","addCreatedComponentToDynamicZone","dynamicZoneTarget","componentsToAdd","dzAttributeIndex","changeDynamicZoneComponents","newComponents","currentDZComponents","updatedComponents","makeUnique","editAttribute","initialAttributeIndex","previousTarget","newTarget","previousTargetAttributeIndex","previousTargetAttribute","newRelationType","isBidirectionnal","newTargetAttribute","conditions","editCustomFieldAttribute","initialAttributeName","reloadPlugin","removeComponentFromDynamicZone","dzName","componentToRemoveIndex","removeField","attributeToRemoveName","attributeToRemoveIndex","targetAttributeName","targetContentType","targetAttributeIndex","targetField","updateComponentSchema","updateComponentUid","newComponentUID","newType","updateSchema","previousKind","oldSection","deleteComponent","deleteContentType","createFolder","rawName","parentId","MAX_FOLDER_DEPTH","isFolderNameTakenBySibling","renameFolder","moveFolder","newParentId","newTopDepth","oldParent","newParent","entry","length","currentIndex","candidate","moved","rootIds","anchorId","insertAt","deleteFolderOnly","groupToDeleteId","groupToDelete","groupToDeleteParentId","getDeleteFolderOnlySiblingNameCollisions","childGroup","groupToDeleteParent","groupToDeleteIndex","deleteFolderAndContent","contentTypeUids","toRemove","Set","collect","currentGroupId","add","currentGroup","has","assignContentTypeToFolder","reorderFolderChildren","groupId","applyChange","reducerAction","schema","isComponent","exists","isUnsaved","limit","excludeActionsFromHistory","stateSelector","discard","reducer","actions"],"mappings":"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"}
1
+ {"version":3,"file":"reducer.js","sources":["../../../../admin/src/components/DataManager/reducer.ts"],"sourcesContent":["import { PayloadAction } from '@reduxjs/toolkit';\nimport merge from 'lodash/merge';\nimport omit from 'lodash/omit';\nimport uniq from 'lodash/uniq';\n\nimport { applyPrivateSearchDefault } from '../../utils/applyPrivateSearchDefault';\nimport { getRelationType } from '../../utils/getRelationType';\nimport { makeUnique } from '../../utils/makeUnique';\n\nimport { createUndoRedoSlice } from './undoRedo';\nimport {\n createEmptyContentStructure,\n findSiblingFolderByName,\n getDeleteFolderOnlySiblingNameCollisions,\n isFolderNameTakenBySibling,\n MAX_FOLDER_DEPTH,\n sectionKeyForKind,\n} from './utils/contentStructure';\nimport { isStorageCompatibleRename } from './utils/isStorageCompatibleRename';\n\nimport type {\n Components,\n ContentTypes,\n ContentType,\n Component,\n Status,\n AnyAttribute,\n} from '../../types';\nimport type {\n ContentStructure,\n ContentStructureGroup,\n ContentStructureSection,\n GroupStatus,\n SectionKey,\n} from './utils/contentStructure';\nimport type { Internal, Schema, Struct, UID } from '@strapi/types';\n\nexport interface DataManagerStateType {\n components: Components;\n initialComponents: Components;\n contentTypes: ContentTypes;\n initialContentTypes: ContentTypes;\n contentStructure: ContentStructure;\n initialContentStructure: ContentStructure;\n reservedNames: {\n models: string[];\n attributes: string[];\n };\n isLoading: boolean;\n [key: string]: unknown;\n}\n\nconst initialState: DataManagerStateType = {\n components: {},\n contentTypes: {},\n initialComponents: {},\n initialContentTypes: {},\n contentStructure: createEmptyContentStructure(),\n initialContentStructure: createEmptyContentStructure(),\n reservedNames: {\n models: [],\n attributes: [],\n },\n isLoading: true,\n};\n\nconst ONE_SIDE_RELATIONS = ['oneWay', 'manyWay'];\n\ntype AttributeMutation = AnyAttribute & {\n createComponent?: unknown;\n};\n\ntype PluginOptions = Record<string, unknown>;\n\nconst getOppositeRelation = (originalRelation?: Schema.Attribute.RelationKind.Any) => {\n if (originalRelation === 'manyToOne') {\n return 'oneToMany';\n }\n\n if (originalRelation === 'oneToMany') {\n return 'manyToOne';\n }\n\n return originalRelation;\n};\n\nconst findAttributeIndex = (type: ContentType | Component, attributeToFind?: string) => {\n return type.attributes.findIndex(({ name }: { name: string }) => name === attributeToFind);\n};\n\ntype InitPayload = {\n components: Record<string, Component>;\n contentTypes: Record<string, ContentType>;\n reservedNames: DataManagerStateType['reservedNames'];\n contentStructure?: ContentStructure;\n};\n\ntype CreateFolderPayload = {\n parentId: string | null;\n section: SectionKey;\n name: string;\n id: string;\n};\n\ntype RenameFolderPayload = {\n section: SectionKey;\n name: string;\n id: string;\n};\n\ntype MoveFolderPayload = {\n newParentId: string | null;\n section: SectionKey;\n index?: number;\n id: string;\n};\n\ntype DeleteFolderPayload = {\n section: SectionKey;\n id: string;\n};\n\ntype DeleteFolderAndContentPayload = DeleteFolderPayload & {\n contentTypeUids: Internal.UID.ContentType[];\n};\n\ntype AssignContentTypeToFolderPayload = {\n targetGroupId: string | null;\n uid: UID.ContentType;\n section: SectionKey;\n index?: number;\n};\n\ntype ReorderFolderChildrenPayload = {\n section: SectionKey;\n groupId: string;\n from: number;\n to: number;\n};\n\ntype AddAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype AddCreateComponentToDynamicZonePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n dynamicZoneTarget: string;\n componentsToAdd: Internal.UID.Component[];\n};\n\ntype AddCustomFieldAttributePayload = {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype ChangeDynamicZoneComponentsPayload = {\n dynamicZoneTarget: string;\n newComponents: Internal.UID.Component[];\n forTarget: Struct.ModelType;\n targetUid: string;\n};\n\ntype CreateComponentSchemaPayload = {\n uid: string;\n data: {\n icon?: string;\n displayName: string;\n };\n componentCategory: string;\n};\n\ntype FolderAssignmentPayload =\n | { targetGroupId: string | null }\n | { newFolderId: string; newFolderName: string };\n\ntype CreateSchemaPayload = {\n uid: string;\n data: {\n displayName: string;\n singularName: string;\n pluralName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: PluginOptions;\n };\n folder?: FolderAssignmentPayload;\n};\n\ntype RenameConsentPayload = {\n /** Record the hop so the server preserves data (default). */\n recordRename?: boolean;\n /**\n * The user declined to preserve data for this hop: remember both names so\n * later hops of the same chain are declined without another prompt.\n */\n declineRename?: boolean;\n /**\n * Same pair for the other side of a bidirectional relation, when the edit\n * renames it on the target type.\n */\n recordTargetRename?: boolean;\n declineTargetRename?: boolean;\n};\n\ntype EditAttributePayload = RenameConsentPayload & {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n name: string;\n};\n\ntype EditCustomFieldAttributePayload = RenameConsentPayload & {\n attributeToSet: AttributeMutation;\n forTarget: Struct.ModelType;\n targetUid: string;\n name: string;\n};\n\ntype RemoveComponentFromDynamicZonePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n dzName: string;\n componentToRemoveIndex: number;\n};\n\ntype RemoveFieldPayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n attributeToRemoveName: string;\n};\n\ntype UpdateComponentSchemaPayload = {\n data: {\n icon?: string;\n displayName: string;\n };\n uid: Internal.UID.Component;\n};\n\ntype UpdateComponentUIDPayload = {\n uid: Internal.UID.Component;\n newComponentUID: Internal.UID.Component;\n};\n\ntype UpdateSchemaPayload = {\n data: {\n displayName: string;\n kind: Struct.ContentTypeKind;\n draftAndPublish: boolean;\n pluginOptions: PluginOptions;\n };\n uid: string;\n folder?: FolderAssignmentPayload;\n};\n\ntype MoveAttributePayload = {\n forTarget: Struct.ModelType;\n targetUid: string;\n from: number;\n to: number;\n};\n\nconst getType = (\n state: DataManagerStateType,\n {\n forTarget,\n targetUid,\n }: {\n forTarget: Struct.ModelType;\n targetUid: string;\n }\n) => {\n return forTarget === 'contentType' ? state.contentTypes[targetUid] : state.components[targetUid];\n};\n\n// TODO: use initial state when chnaging back to the initial state without knowing\nconst setStatus = (type: ContentType | Component, status: Status) => {\n switch (type.status) {\n case 'NEW':\n case 'REMOVED': {\n break;\n }\n default: {\n type.status = status;\n }\n }\n};\n\nconst getNewStatus = (oldStatus: Status | undefined, newStatus: Status) => {\n if (oldStatus === 'NEW' || oldStatus === 'REMOVED') {\n return oldStatus;\n }\n\n return newStatus;\n};\n\nconst getNewGroupStatus = (oldStatus: GroupStatus, newStatus: GroupStatus): GroupStatus => {\n if (oldStatus === 'NEW') {\n return oldStatus;\n }\n\n return newStatus;\n};\n\nconst setAttributeStatus = (attribute: { status?: Status }, status: Status) => {\n attribute.status = getNewStatus(attribute.status, status);\n};\n\nconst createAttribute = (properties: Record<string, unknown>): AnyAttribute => {\n return {\n ...applyPrivateSearchDefault(properties),\n status: 'NEW',\n } as AnyAttribute;\n};\n\n/**\n * Records an attribute rename hop in the order the user performed it, so the\n * server can replay the exact path as a data-preserving migration.\n *\n * - Only renames of fields that already exist in the database are recorded; a\n * brand-new field (status NEW) has no data yet, so its renames are ignored.\n * - A rename that also changes the field's type / relation / component is not\n * recorded (see `isStorageCompatibleRename`).\n * - Each hop (`previousName -> newName`) is appended verbatim. The recorded\n * sequence is inherently collision-free because the CTB never allows two\n * fields to share a name — a \"swap\" is expressed through the user's own\n * intermediate-name hop, so no synthetic temp column is ever needed.\n */\nconst recordRename = (\n type: ContentType | Component,\n previousAttribute: AnyAttribute,\n newAttribute: AnyAttribute\n): void => {\n if (previousAttribute.status === 'NEW') {\n return;\n }\n\n const oldName = previousAttribute.name;\n const newName = newAttribute?.name;\n if (!newName || oldName === newName) {\n return;\n }\n\n if (!isStorageCompatibleRename(previousAttribute, newAttribute)) {\n return;\n }\n\n if (!type.renames) {\n type.renames = [];\n }\n\n type.renames.push({ oldName, newName });\n};\n\n/**\n * Remembers the names of a rename hop the user declined to preserve data for,\n * so the rest of that chain is declined without another prompt.\n */\nconst recordDeclinedRename = (\n type: ContentType | Component,\n previousAttribute: AnyAttribute,\n newAttribute: AnyAttribute\n): void => {\n const oldName = previousAttribute.name;\n const newName = newAttribute?.name;\n if (!newName || oldName === newName) {\n return;\n }\n\n type.declinedRenameNames = uniq([...(type.declinedRenameNames ?? []), oldName, newName]);\n};\n\n/**\n * Applies the rename consent carried by an edit: either records the hop or\n * remembers it as declined. Never both.\n */\nconst applyRenameConsent = (\n type: ContentType | Component,\n previousAttribute: AnyAttribute,\n newAttribute: AnyAttribute,\n {\n recordRename: shouldRecordRename = true,\n declineRename: shouldDecline = false,\n }: RenameConsentPayload\n): void => {\n if (shouldDecline) {\n recordDeclinedRename(type, previousAttribute, newAttribute);\n return;\n }\n\n if (shouldRecordRename) {\n recordRename(type, previousAttribute, newAttribute);\n }\n};\n\nconst setAttributeAt = (type: ContentType | Component, index: number, attribute: AnyAttribute) => {\n const previousAttribute = type.attributes[index];\n\n const newStatus = getNewStatus(previousAttribute.status, 'CHANGED');\n\n type.attributes[index] = {\n ...applyPrivateSearchDefault(attribute),\n status: newStatus,\n };\n\n setStatus(type, 'CHANGED');\n};\n\nconst pushAttribute = (type: ContentType | Component, attribute: AnyAttribute) => {\n type.attributes.push(attribute);\n setStatus(type, 'CHANGED');\n};\n\nconst removeAttributeAt = (type: ContentType | Component, index: number) => {\n const attr = type.attributes[index];\n\n setStatus(type, 'CHANGED');\n\n if (attr.status === 'NEW') {\n type.attributes.splice(index, 1);\n } else {\n setAttributeStatus(attr, 'REMOVED');\n }\n};\n\nconst replaceAttributeAt = (\n type: ContentType | Component,\n index: number,\n attribute: AnyAttribute\n) => {\n type.attributes[index] = attribute;\n setStatus(type, 'CHANGED');\n};\n\nconst removeAttributeByName = (type: ContentType | Component, name: string) => {\n const idx = type.attributes.findIndex((attr) => attr.name === name);\n\n if (idx === -1) {\n return;\n }\n\n const attr = type.attributes[idx];\n\n setStatus(type, 'CHANGED');\n\n if (attr.status === 'NEW') {\n type.attributes.splice(idx, 1);\n } else {\n setAttributeStatus(attr, 'REMOVED');\n }\n};\n\n/**\n * Carries the pending rename state of `existing` over to a full replacement of\n * the type (the AI chat's `applyChange`). Appending the incoming hops after the\n * existing ones is order-correct: the chat transform diffs against the current\n * reducer entry, whose attributes already carry the manual renames, so its hops\n * start from where the manual hops ended.\n */\nconst mergeRenameState = (\n existing: Pick<ContentType, 'renames' | 'declinedRenameNames'> | undefined,\n incoming: Pick<ContentType, 'renames' | 'declinedRenameNames'>\n): Pick<ContentType, 'renames' | 'declinedRenameNames'> => {\n const renames = [...(existing?.renames ?? []), ...(incoming.renames ?? [])];\n const declinedRenameNames = uniq([\n ...(existing?.declinedRenameNames ?? []),\n ...(incoming.declinedRenameNames ?? []),\n ]);\n\n return {\n ...(renames.length > 0 ? { renames } : {}),\n ...(declinedRenameNames.length > 0 ? { declinedRenameNames } : {}),\n };\n};\n\nconst updateType = (type: ContentType | Component, data: Record<string, unknown>) => {\n merge(type, data);\n setStatus(type, 'CHANGED');\n};\n\nconst findGroup = (groups: ContentStructureGroup[], id: string) => {\n return groups.find((group) => group.id === id);\n};\n\nconst setGroupStatus = (group: ContentStructureGroup, status: GroupStatus): void => {\n group.status = getNewGroupStatus(group.status, status);\n};\n\n/**\n * Remove a content type reference from every group of a section, mark the group as changed if a reference was removed.\n * @returns true if a reference was removed, false otherwise.\n */\nconst removeContentTypeChild = (groups: ContentStructureGroup[], uid: string): boolean => {\n let removed = false;\n\n for (const group of groups) {\n const groupIndex = group.children.findIndex((child) => {\n return child.type === 'contentType' && child.uid === uid;\n });\n\n if (groupIndex !== -1) {\n group.children.splice(groupIndex, 1);\n setGroupStatus(group, 'CHANGED');\n removed = true;\n }\n }\n\n return removed;\n};\n\n/**\n * Assign a content type to a folder within a single section, optionally creating\n * a new root folder first.\n *\n * Detaches the content type from any current folder then files it under the target group.\n * This is also used by the create/edit content-type modal's folder picker via\n * createSchema/updateSchema.\n */\nconst applyFolderAssignment = (\n section: ContentStructureSection,\n uid: UID.ContentType,\n folder: FolderAssignmentPayload\n): void => {\n const { groups } = section;\n\n removeContentTypeChild(groups, uid);\n\n let targetGroupId: string | null;\n\n if ('newFolderId' in folder) {\n // Reuse an existing root folder of the same name instead of creating a\n // duplicate. The modal picker can only ever makes root folders, so\n // this makes the assumption that a same-named root folder means the\n // user wants to insert into that folder.\n const existing = findSiblingFolderByName(groups, null, folder.newFolderName);\n\n if (existing) {\n targetGroupId = existing.id;\n } else {\n groups.push({\n name: folder.newFolderName.trim(),\n id: folder.newFolderId,\n parent: null,\n children: [],\n status: 'NEW',\n });\n\n targetGroupId = folder.newFolderId;\n }\n } else {\n targetGroupId = folder.targetGroupId;\n }\n\n if (!targetGroupId) {\n return;\n }\n\n const targetGroup = findGroup(groups, targetGroupId);\n\n if (targetGroup) {\n targetGroup.children.push({ type: 'contentType', uid });\n setGroupStatus(targetGroup, 'CHANGED');\n }\n};\n\n/**\n * Determines whether `potentialDescendantId` is nested somewhere inside `ancestorId`'s subtree\n */\nconst isDescendantGroup = (\n groups: ContentStructureGroup[],\n ancestorId: string,\n potentialDescendantId: string\n): boolean => {\n let current = findGroup(groups, potentialDescendantId);\n\n while (current && current.parent !== null) {\n if (current.parent === ancestorId) {\n return true;\n }\n\n current = findGroup(groups, current.parent);\n }\n\n return false;\n};\n\nconst getGroupDepth = (groups: ContentStructureGroup[], id: string): number => {\n let depth = 1;\n let current = findGroup(groups, id);\n\n while (current && current.parent !== null) {\n current = findGroup(groups, current.parent);\n depth += 1;\n }\n\n return depth;\n};\n\n/**\n * Number of folder levels below a group e.g. a group with no sub-folders has height 0.\n */\nconst getSubtreeHeight = (groups: ContentStructureGroup[], id: string): number => {\n const group = findGroup(groups, id);\n\n if (!group) {\n return 0;\n }\n\n let height = 0;\n\n for (const child of group.children) {\n if (child.type !== 'group') continue;\n height = Math.max(height, 1 + getSubtreeHeight(groups, child.id));\n }\n\n return height;\n};\n\nconst applyDeleteContentType = (state: DataManagerStateType, uid: Internal.UID.ContentType) => {\n const type = state.contentTypes[uid];\n\n // Only application schemas belong to CTB. Folder actions can be crafted outside the UI,\n // so this guard must live at the mutation boundary rather than in the dialog alone.\n if (!type || !type.uid.startsWith('api::') || type.plugin) {\n return;\n }\n\n // just drop new content types\n if (type.status === 'NEW') {\n delete state.contentTypes[uid];\n } else {\n setStatus(type, 'REMOVED');\n }\n\n // remove the content type from the content structure tree\n Object.values(state.contentStructure.sections).forEach((section) => {\n removeContentTypeChild(section.groups, uid);\n });\n\n // remove the content type from the components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n const namesToRemove = component.attributes\n .filter((attribute) => attribute.type === 'relation' && attribute.target === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(component, name);\n });\n });\n\n // remove the content type from the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n const namesToRemove = contentType.attributes\n .filter((attribute) => attribute.type === 'relation' && attribute.target === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(contentType, name);\n });\n });\n};\n\nconst slice = createUndoRedoSlice(\n {\n name: 'data-manager',\n initialState,\n reducers: {\n init: (state, action: PayloadAction<InitPayload>) => {\n const { components, contentTypes, reservedNames, contentStructure } = action.payload;\n\n state.components = components;\n state.initialComponents = components;\n state.initialContentTypes = contentTypes;\n state.contentTypes = contentTypes;\n state.reservedNames = reservedNames;\n\n const structure = contentStructure ?? createEmptyContentStructure();\n state.initialContentStructure = structure;\n state.contentStructure = structure;\n\n state.isLoading = false;\n },\n createComponentSchema: (state, action: PayloadAction<CreateComponentSchemaPayload>) => {\n const { uid, data, componentCategory } = action.payload;\n\n const newSchema: Component = {\n uid: uid as Internal.UID.Component,\n status: 'NEW',\n category: componentCategory,\n modelName: data.displayName,\n globalId: data.displayName,\n info: {\n icon: data.icon,\n displayName: data.displayName,\n },\n attributes: [],\n modelType: 'component',\n };\n\n state.components[uid as string] = newSchema;\n },\n createSchema: (state, action: PayloadAction<CreateSchemaPayload>) => {\n const { uid, data, folder } = action.payload;\n\n const { displayName, singularName, pluralName, kind, draftAndPublish, pluginOptions } =\n data;\n\n const newSchema: ContentType = {\n uid: uid as Internal.UID.ContentType,\n status: 'NEW',\n visible: true,\n modelType: 'contentType',\n restrictRelationsTo: null,\n attributes: [],\n kind,\n modelName: displayName,\n globalId: displayName,\n options: {\n draftAndPublish,\n },\n info: {\n displayName,\n singularName,\n pluralName,\n },\n pluginOptions,\n };\n\n state.contentTypes[uid] = newSchema;\n\n // File the new content type into a folder in the same transaction it is created,\n // so both are subject to the same undo/redo operatiion.\n if (folder) {\n applyFolderAssignment(\n state.contentStructure.sections[sectionKeyForKind(kind)],\n uid as UID.ContentType,\n folder\n );\n }\n },\n addAttribute: (state, action: PayloadAction<AddAttributePayload>) => {\n const { attributeToSet, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attribute = createAttribute(omit(attributeToSet, 'createComponent'));\n\n if (attribute.type === 'relation') {\n const target = attribute.target;\n const targetAttribute = attribute.targetAttribute || null;\n const relation = attribute.relation;\n const relationType = getRelationType(relation, targetAttribute);\n\n const isBidirectionalRelation =\n relationType !== undefined && !['oneWay', 'manyWay'].includes(relationType);\n\n if (isBidirectionalRelation) {\n const oppositeAttribute = createAttribute({\n name: targetAttribute,\n relation: getOppositeRelation(relationType),\n target: type.uid,\n targetAttribute: attribute.name,\n type: 'relation',\n private: attribute.private,\n });\n\n const targetType = getType(state, { forTarget, targetUid: target });\n pushAttribute(targetType, oppositeAttribute);\n }\n }\n\n pushAttribute(type, attribute);\n setStatus(type, 'CHANGED');\n },\n moveAttribute: (state, action: PayloadAction<MoveAttributePayload>) => {\n const { forTarget, targetUid, from, to } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attribute = type.attributes[from];\n type.attributes.splice(from, 1);\n type.attributes.splice(to, 0, attribute);\n setStatus(type, 'CHANGED');\n },\n addCustomFieldAttribute: (state, action: PayloadAction<AddCustomFieldAttributePayload>) => {\n const { attributeToSet, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n pushAttribute(type, createAttribute(attributeToSet));\n },\n addCreatedComponentToDynamicZone: (\n state,\n action: PayloadAction<AddCreateComponentToDynamicZonePayload>\n ) => {\n const { dynamicZoneTarget, componentsToAdd, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const dzAttributeIndex = findAttributeIndex(type, dynamicZoneTarget);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n\n componentsToAdd.forEach((componentUid: Internal.UID.Component) => {\n attr.components.push(componentUid);\n });\n\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n setStatus(type, 'CHANGED');\n },\n changeDynamicZoneComponents: (\n state,\n action: PayloadAction<ChangeDynamicZoneComponentsPayload>\n ) => {\n const { dynamicZoneTarget, newComponents, forTarget, targetUid } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const dzAttributeIndex = findAttributeIndex(type, dynamicZoneTarget);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n const currentDZComponents = attr.components;\n\n const updatedComponents = makeUnique([...currentDZComponents, ...newComponents]);\n\n setStatus(type, 'CHANGED');\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n attr.components = updatedComponents;\n },\n editAttribute: (state, action: PayloadAction<EditAttributePayload>) => {\n const {\n name,\n attributeToSet,\n forTarget,\n targetUid,\n recordRename,\n declineRename,\n recordTargetRename,\n declineTargetRename,\n } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const initialAttributeIndex = findAttributeIndex(type, name);\n\n if (initialAttributeIndex === -1) {\n return;\n }\n\n const previousAttribute = type.attributes[initialAttributeIndex];\n\n applyRenameConsent(type, previousAttribute, attributeToSet as AnyAttribute, {\n recordRename,\n declineRename,\n });\n\n setAttributeAt(type, initialAttributeIndex, attributeToSet as AnyAttribute);\n\n if (previousAttribute.type !== attributeToSet.type) {\n return;\n }\n\n if (previousAttribute.type !== 'relation' || attributeToSet.type !== 'relation') {\n return;\n }\n\n const previousTarget = getType(state, {\n forTarget: 'contentType',\n targetUid: previousAttribute.target,\n });\n const newTarget = getType(state, {\n forTarget: 'contentType',\n targetUid: attributeToSet.target,\n });\n\n const previousTargetAttributeIndex = findAttributeIndex(\n previousTarget,\n previousAttribute.targetAttribute ?? ''\n );\n const previousTargetAttribute =\n previousTargetAttributeIndex !== -1\n ? previousTarget.attributes[previousTargetAttributeIndex]\n : undefined;\n\n // remove old targetAttribute\n if (previousAttribute.targetAttribute) {\n removeAttributeByName(previousTarget, previousAttribute.targetAttribute);\n }\n\n const newRelationType = getRelationType(\n attributeToSet.relation,\n attributeToSet.targetAttribute\n );\n const isBidirectionnal =\n newRelationType !== undefined && !ONE_SIDE_RELATIONS.includes(newRelationType);\n\n if (isBidirectionnal) {\n const newTargetAttribute = {\n name: attributeToSet.targetAttribute,\n type: 'relation',\n relation: getOppositeRelation(attributeToSet.relation),\n targetAttribute: attributeToSet.name,\n target: type.uid,\n private: previousAttribute.private ?? attributeToSet.private,\n pluginOptions: previousAttribute.pluginOptions ?? attributeToSet.pluginOptions,\n ...(previousTarget.uid === newTarget.uid && previousTargetAttribute?.conditions\n ? { conditions: previousTargetAttribute.conditions }\n : {}),\n status: 'CHANGED',\n } as AnyAttribute;\n\n // create or recreate(at old index) targetAttribute\n if (previousTargetAttributeIndex !== -1 && previousTarget.uid === newTarget.uid) {\n // The counterpart is renamed on the target type: without a hop\n // there, the side owning the join table would lose its links.\n if (previousTargetAttribute) {\n applyRenameConsent(newTarget, previousTargetAttribute, newTargetAttribute, {\n recordRename: recordTargetRename,\n declineRename: declineTargetRename,\n });\n }\n\n // re-create at previousIdx if possible\n replaceAttributeAt(newTarget, previousTargetAttributeIndex, newTargetAttribute);\n } else {\n pushAttribute(newTarget, {\n ...newTargetAttribute,\n status: 'NEW',\n });\n }\n }\n },\n editCustomFieldAttribute: (state, action: PayloadAction<EditCustomFieldAttributePayload>) => {\n const { forTarget, targetUid, name, attributeToSet, recordRename, declineRename } =\n action.payload;\n\n const initialAttributeName = name;\n const type = getType(state, { forTarget, targetUid });\n\n const initialAttributeIndex = findAttributeIndex(type, initialAttributeName);\n const previousAttribute = type.attributes[initialAttributeIndex];\n\n setAttributeAt(type, initialAttributeIndex, attributeToSet as AnyAttribute);\n applyRenameConsent(type, previousAttribute, attributeToSet as AnyAttribute, {\n recordRename,\n declineRename,\n });\n },\n reloadPlugin: () => {\n return initialState;\n },\n removeComponentFromDynamicZone: (\n state,\n action: PayloadAction<RemoveComponentFromDynamicZonePayload>\n ) => {\n const { dzName, componentToRemoveIndex, forTarget, targetUid } = action.payload;\n\n const type =\n forTarget === 'contentType' ? state.contentTypes[targetUid] : state.components[targetUid];\n\n if (!type) {\n return;\n }\n\n const dzAttributeIndex = findAttributeIndex(type, dzName);\n const attr = type.attributes[dzAttributeIndex] as Schema.Attribute.DynamicZone;\n\n setStatus(type, 'CHANGED');\n setAttributeStatus(attr as AnyAttribute, 'CHANGED');\n attr.components.splice(componentToRemoveIndex, 1);\n },\n removeField: (state, action: PayloadAction<RemoveFieldPayload>) => {\n const { forTarget, targetUid, attributeToRemoveName } = action.payload;\n\n const type = getType(state, { forTarget, targetUid });\n\n const attributeToRemoveIndex = findAttributeIndex(type, attributeToRemoveName);\n const attribute = type.attributes[attributeToRemoveIndex];\n\n if (attribute.type === 'relation') {\n const { target, relation, targetAttribute: targetAttributeName } = attribute;\n const relationType = getRelationType(relation, targetAttributeName);\n\n const isBidirectionnal = !ONE_SIDE_RELATIONS.includes(relationType!);\n\n if (isBidirectionnal && targetAttributeName) {\n const targetContentType = getType(state, { forTarget, targetUid: target });\n const targetAttributeIndex = findAttributeIndex(targetContentType, targetAttributeName);\n\n removeAttributeAt(targetContentType, targetAttributeIndex);\n }\n }\n\n // Find all uid fields that have the targetField set to the field we are removing\n type.attributes.forEach((attribute) => {\n if (attribute.type === 'uid') {\n if (attribute.targetField === attributeToRemoveName) {\n delete attribute.targetField;\n }\n }\n });\n\n removeAttributeAt(type, attributeToRemoveIndex);\n },\n // only edits a component in practice\n updateComponentSchema: (state, action: PayloadAction<UpdateComponentSchemaPayload>) => {\n const { data, uid } = action.payload;\n\n const type = state.components[uid];\n if (!type) {\n return;\n }\n\n updateType(type, {\n info: {\n displayName: data.displayName,\n icon: data.icon,\n },\n });\n },\n updateComponentUid: (state, action: PayloadAction<UpdateComponentUIDPayload>) => {\n const { newComponentUID, uid } = action.payload;\n\n const type = state.components[uid];\n if (!type || type.status !== 'NEW') {\n return;\n }\n\n if (newComponentUID !== uid) {\n const newType = { ...type, uid: newComponentUID };\n state.components[newComponentUID] = newType;\n delete state.components[uid];\n\n // update the uid in the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'dynamiczone') {\n const newComponents = attribute.components.map((component: UID.Component) => {\n if (component === uid) {\n return newComponentUID;\n }\n\n return component;\n });\n\n attribute.components = newComponents;\n }\n });\n\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'component' && attribute.component === uid) {\n attribute.component = newComponentUID;\n }\n });\n });\n\n // update the uid in the other components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n component.attributes.forEach((attribute) => {\n if (attribute.type === 'component' && attribute.component === uid) {\n attribute.component = newComponentUID;\n }\n });\n });\n }\n },\n updateSchema: (state, action: PayloadAction<UpdateSchemaPayload>) => {\n const { data, uid, folder } = action.payload;\n\n const { displayName, kind, draftAndPublish, pluginOptions } = data;\n\n const type = state.contentTypes[uid];\n if (!type) {\n return;\n }\n\n const previousKind = type.kind;\n\n updateType(type, {\n info: {\n displayName,\n },\n kind,\n options: {\n draftAndPublish,\n },\n pluginOptions,\n });\n\n if (kind && kind !== previousKind) {\n const oldSection = state.contentStructure.sections[sectionKeyForKind(previousKind)];\n removeContentTypeChild(oldSection.groups, uid);\n }\n\n // Apply the folder picker's choice after any kind relocation, so the\n // assignment lands in the content type's (possibly new) section.\n if (folder) {\n applyFolderAssignment(\n state.contentStructure.sections[sectionKeyForKind(kind)],\n uid as UID.ContentType,\n folder\n );\n }\n },\n deleteComponent: (state, action: PayloadAction<Internal.UID.Component>) => {\n const uid = action.payload;\n\n // remove the compo from the components\n if (state.components[uid].status === 'NEW') {\n delete state.components[uid];\n } else {\n setStatus(state.components[uid], 'REMOVED');\n }\n\n // remove the compo from the content types\n Object.keys(state.contentTypes).forEach((contentTypeUid) => {\n const contentType = state.contentTypes[contentTypeUid];\n\n // remove from dynamic zones\n contentType.attributes.forEach((attribute) => {\n if (attribute.type === 'dynamiczone') {\n const newComponents = attribute.components.filter(\n (component: unknown) => component !== uid\n );\n\n attribute.components = newComponents;\n }\n });\n\n const namesToRemove = contentType.attributes\n .filter((attribute) => attribute.type === 'component' && attribute.component === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(contentType, name);\n });\n });\n\n // remove the compo from other components\n Object.keys(state.components).forEach((componentUid) => {\n const component = state.components[componentUid];\n\n const namesToRemove = component.attributes\n .filter((attribute) => attribute.type === 'component' && attribute.component === uid)\n .map((attribute) => attribute.name);\n\n namesToRemove.forEach((name) => {\n removeAttributeByName(component, name);\n });\n });\n },\n deleteContentType: (state, action: PayloadAction<Internal.UID.ContentType>) => {\n applyDeleteContentType(state, action.payload);\n },\n\n createFolder: (state, action: PayloadAction<CreateFolderPayload>) => {\n const { section, id, name: rawName, parentId } = action.payload;\n const name = rawName.trim();\n const { groups } = state.contentStructure.sections[section];\n\n if (parentId && getGroupDepth(groups, parentId) + 1 > MAX_FOLDER_DEPTH) {\n return;\n }\n\n if (isFolderNameTakenBySibling(groups, parentId, name)) {\n return;\n }\n\n groups.push({ id, name, parent: parentId, children: [], status: 'NEW' });\n\n if (parentId) {\n const parent = findGroup(groups, parentId);\n\n if (parent) {\n parent.children.push({ type: 'group', id });\n setGroupStatus(parent, 'CHANGED');\n }\n }\n },\n renameFolder: (state, action: PayloadAction<RenameFolderPayload>) => {\n const { section, id, name: rawName } = action.payload;\n const name = rawName.trim();\n\n const { groups } = state.contentStructure.sections[section];\n const group = findGroup(groups, id);\n if (!group) {\n return;\n }\n\n if (group.name === name) {\n return;\n }\n\n if (isFolderNameTakenBySibling(groups, group.parent, name, id)) {\n return;\n }\n\n group.name = name;\n setGroupStatus(group, 'CHANGED');\n },\n moveFolder: (state, action: PayloadAction<MoveFolderPayload>) => {\n const { section, id, newParentId, index } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n const group = findGroup(groups, id);\n if (!group) {\n return;\n }\n\n // Reject no-ops and cyclic moves\n if (newParentId === id || (newParentId && isDescendantGroup(groups, id, newParentId))) {\n return;\n }\n\n // Refuse moves that would exceed the maximum allowed depth.\n const newTopDepth = newParentId ? getGroupDepth(groups, newParentId) + 1 : 1;\n if (newTopDepth + getSubtreeHeight(groups, id) > MAX_FOLDER_DEPTH) {\n return;\n }\n\n // Refuse a move that would collide with an identically named sibling.\n if (isFolderNameTakenBySibling(groups, newParentId, group.name, id)) {\n return;\n }\n\n if (group.parent) {\n const oldParent = findGroup(groups, group.parent);\n\n if (oldParent) {\n // Remove from the old parent's list of children.\n const idx = oldParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === id;\n });\n\n if (idx !== -1) {\n oldParent.children.splice(idx, 1);\n }\n\n setGroupStatus(oldParent, 'CHANGED');\n }\n }\n\n group.parent = newParentId;\n setGroupStatus(group, 'CHANGED');\n\n if (newParentId) {\n const newParent = findGroup(groups, newParentId);\n\n if (newParent) {\n const entry = { type: 'group' as const, id };\n\n if (typeof index === 'number' && index >= 0 && index <= newParent.children.length) {\n newParent.children.splice(index, 0, entry);\n } else {\n newParent.children.push(entry);\n }\n\n setGroupStatus(newParent, 'CHANGED');\n }\n } else if (typeof index === 'number') {\n // If a content type is dropped into the root:\n // The root display order follows the array order of the\n // section's root-level groups because there's no root level\n // customization yet, so reposition the moved group among them.\n const currentIndex = groups.findIndex((candidate) => candidate.id === id);\n\n if (currentIndex !== -1) {\n const [moved] = groups.splice(currentIndex, 1);\n const rootIds = groups\n .filter((candidate) => candidate.parent === null)\n .map((candidate) => candidate.id);\n const anchorId = rootIds[index];\n const insertAt = anchorId\n ? groups.findIndex((candidate) => candidate.id === anchorId)\n : groups.length;\n\n groups.splice(insertAt === -1 ? groups.length : insertAt, 0, moved);\n }\n }\n },\n deleteFolderOnly: (state, action: PayloadAction<DeleteFolderPayload>) => {\n const { section, id: groupToDeleteId } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n const groupToDelete = findGroup(groups, groupToDeleteId);\n if (!groupToDelete) {\n return;\n }\n\n const groupToDeleteParentId = groupToDelete.parent;\n\n // Reparenting a child folder into its grandparent must preserve the same sibling-name\n // invariant as create, rename, and move. Do this before mutating any group state.\n if (getDeleteFolderOnlySiblingNameCollisions(groups, groupToDeleteId).length > 0) {\n return;\n }\n\n // It is necessary to clone the children because we must subsequently mutate the original group.children array when we splice it out of its parent.\n const children = groupToDelete.children.map((child) => ({ ...child }));\n\n // Children of a deleted folder inherit the deleted folder's parent.\n children.forEach((child) => {\n if (child.type === 'group') {\n const childGroup = findGroup(groups, child.id);\n\n if (childGroup) {\n childGroup.parent = groupToDeleteParentId;\n }\n }\n });\n\n if (groupToDeleteParentId) {\n const groupToDeleteParent = findGroup(groups, groupToDeleteParentId);\n\n if (groupToDeleteParent) {\n // Splice the deleted folder's children of the deleted folder into their new parent at the position of the deleted folder.\n const groupToDeleteIndex = groupToDeleteParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === groupToDeleteId;\n });\n\n if (groupToDeleteIndex !== -1) {\n groupToDeleteParent.children.splice(groupToDeleteIndex, 1, ...children);\n } else {\n groupToDeleteParent.children.push(...children);\n }\n\n setGroupStatus(groupToDeleteParent, 'CHANGED');\n }\n }\n\n // Finally, remove the deleted folder from its section's list of groups.\n const groupIndex = groups.findIndex((candidate) => {\n return candidate.id === groupToDeleteId;\n });\n\n if (groupIndex !== -1) {\n groups.splice(groupIndex, 1);\n }\n },\n deleteFolderAndContent: (state, action: PayloadAction<DeleteFolderAndContentPayload>) => {\n const { section, id: groupToDeleteId, contentTypeUids } = action.payload;\n\n contentTypeUids.forEach((uid) => {\n applyDeleteContentType(state, uid);\n });\n\n const { groups } = state.contentStructure.sections[section];\n\n const groupToDelete = findGroup(groups, groupToDeleteId);\n if (!groupToDelete) {\n return;\n }\n\n const toRemove = new Set<string>();\n const collect = (currentGroupId: string) => {\n toRemove.add(currentGroupId);\n\n const currentGroup = findGroup(groups, currentGroupId);\n\n for (const child of currentGroup?.children ?? []) {\n if (child.type !== 'group') continue;\n collect(child.id);\n }\n };\n\n collect(groupToDeleteId);\n\n if (groupToDelete.parent) {\n const groupToDeleteParent = findGroup(groups, groupToDelete.parent);\n\n if (groupToDeleteParent) {\n const groupToDeleteIndex = groupToDeleteParent.children.findIndex((child) => {\n return child.type === 'group' && child.id === groupToDeleteId;\n });\n\n if (groupToDeleteIndex !== -1) {\n groupToDeleteParent.children.splice(groupToDeleteIndex, 1);\n }\n\n setGroupStatus(groupToDeleteParent, 'CHANGED');\n }\n }\n\n // Removes the group entry and all its descendants from the contentStructure.\n state.contentStructure.sections[section].groups = groups.filter((candidate) => {\n return !toRemove.has(candidate.id);\n });\n },\n assignContentTypeToFolder: (\n state,\n action: PayloadAction<AssignContentTypeToFolderPayload>\n ) => {\n const { section, uid, targetGroupId, index } = action.payload;\n const { groups } = state.contentStructure.sections[section];\n\n removeContentTypeChild(groups, uid);\n\n if (targetGroupId) {\n const targetGroup = findGroup(groups, targetGroupId);\n\n if (targetGroup) {\n const entry = { type: 'contentType' as const, uid };\n\n if (typeof index === 'number' && index >= 0 && index <= targetGroup.children.length) {\n targetGroup.children.splice(index, 0, entry);\n } else {\n targetGroup.children.push(entry);\n }\n\n setGroupStatus(targetGroup, 'CHANGED');\n }\n }\n },\n reorderFolderChildren: (state, action: PayloadAction<ReorderFolderChildrenPayload>) => {\n const { section, groupId, from, to } = action.payload;\n\n const group = findGroup(state.contentStructure.sections[section].groups, groupId);\n if (!group) {\n return;\n }\n\n const child = group.children[from];\n if (!child) {\n return;\n }\n\n group.children.splice(from, 1);\n group.children.splice(to, 0, child);\n\n setGroupStatus(group, 'CHANGED');\n },\n\n applyChange(\n state,\n reducerAction: PayloadAction<{\n action: 'add' | 'update' | 'delete';\n schema: ContentType | Component;\n }>\n ) {\n const { action, schema } = reducerAction.payload;\n\n switch (action) {\n case 'add':\n {\n const uid = schema.uid;\n\n if (schema.modelType === 'component') {\n state.components[uid] = schema;\n } else {\n state.contentTypes[uid] = schema;\n }\n }\n break;\n case 'update':\n {\n const uid = schema.uid;\n\n // Find the schema, if the state was \"create\", we should keep it as it was before\n\n if (schema.modelType === 'component') {\n const component = state.components[uid];\n state.components[uid] = {\n ...schema,\n ...mergeRenameState(component, schema),\n status: component?.status === 'NEW' ? 'NEW' : schema.status,\n };\n } else {\n const contentType = state.contentTypes[uid];\n const previousKind = contentType?.kind;\n\n state.contentTypes[uid] = {\n ...schema,\n ...mergeRenameState(contentType, schema),\n status: contentType?.status === 'NEW' ? 'NEW' : schema.status,\n };\n\n if (previousKind && schema.kind && schema.kind !== previousKind) {\n const oldSection =\n state.contentStructure.sections[sectionKeyForKind(previousKind)];\n removeContentTypeChild(oldSection.groups, uid);\n }\n }\n }\n break;\n case 'delete': {\n const uid = schema.uid;\n const isComponent = schema.modelType === 'component';\n // It's a component that has yet not been added\n if (isComponent) {\n const exists = state.components[uid];\n if (!exists) {\n return;\n }\n\n const isUnsaved = state.components[uid]?.status === 'NEW';\n if (isUnsaved) {\n delete state.components[uid];\n } else {\n state.components[uid].status = 'REMOVED';\n }\n } else {\n const exists = state.contentTypes[uid];\n if (!exists) {\n return;\n }\n\n const isUnsaved = state.contentTypes[uid]?.status === 'NEW';\n if (isUnsaved) {\n delete state.contentTypes[uid];\n } else {\n state.contentTypes[uid].status = 'REMOVED';\n }\n\n Object.values(state.contentStructure.sections).forEach((section) => {\n removeContentTypeChild(section.groups, uid);\n });\n }\n\n break;\n }\n }\n },\n },\n },\n\n {\n limit: 50,\n excludeActionsFromHistory: ['reloadPlugin', 'init'],\n stateSelector: (state) => {\n if (!state) {\n return {};\n }\n\n return {\n components: state.components,\n contentTypes: state.contentTypes,\n contentStructure: state.contentStructure,\n };\n },\n discard: (state) => {\n state.components = state.initialComponents;\n state.contentTypes = state.initialContentTypes;\n state.contentStructure = state.initialContentStructure;\n },\n }\n);\n\nexport type State = ReturnType<typeof slice.reducer>;\nexport const { reducer, actions } = slice;\nexport { initialState };\n"],"names":["initialState","components","contentTypes","initialComponents","initialContentTypes","contentStructure","createEmptyContentStructure","initialContentStructure","reservedNames","models","attributes","isLoading","ONE_SIDE_RELATIONS","getOppositeRelation","originalRelation","findAttributeIndex","type","attributeToFind","findIndex","name","getType","state","forTarget","targetUid","setStatus","status","getNewStatus","oldStatus","newStatus","getNewGroupStatus","setAttributeStatus","attribute","createAttribute","properties","applyPrivateSearchDefault","recordRename","previousAttribute","newAttribute","oldName","newName","isStorageCompatibleRename","renames","push","recordDeclinedRename","declinedRenameNames","uniq","applyRenameConsent","shouldRecordRename","declineRename","shouldDecline","setAttributeAt","index","pushAttribute","removeAttributeAt","attr","splice","replaceAttributeAt","removeAttributeByName","idx","mergeRenameState","existing","incoming","length","updateType","data","merge","findGroup","groups","id","find","group","setGroupStatus","removeContentTypeChild","uid","removed","groupIndex","children","child","applyFolderAssignment","section","folder","targetGroupId","findSiblingFolderByName","newFolderName","trim","newFolderId","parent","targetGroup","isDescendantGroup","ancestorId","potentialDescendantId","current","getGroupDepth","depth","getSubtreeHeight","height","Math","max","applyDeleteContentType","startsWith","plugin","Object","values","sections","forEach","keys","componentUid","component","namesToRemove","filter","target","map","contentTypeUid","contentType","slice","createUndoRedoSlice","reducers","init","action","payload","structure","createComponentSchema","componentCategory","newSchema","category","modelName","displayName","globalId","info","icon","modelType","createSchema","singularName","pluralName","kind","draftAndPublish","pluginOptions","visible","restrictRelationsTo","options","sectionKeyForKind","addAttribute","attributeToSet","omit","targetAttribute","relation","relationType","getRelationType","isBidirectionalRelation","undefined","includes","oppositeAttribute","private","targetType","moveAttribute","from","to","addCustomFieldAttribute","addCreatedComponentToDynamicZone","dynamicZoneTarget","componentsToAdd","dzAttributeIndex","changeDynamicZoneComponents","newComponents","currentDZComponents","updatedComponents","makeUnique","editAttribute","recordTargetRename","declineTargetRename","initialAttributeIndex","previousTarget","newTarget","previousTargetAttributeIndex","previousTargetAttribute","newRelationType","isBidirectionnal","newTargetAttribute","conditions","editCustomFieldAttribute","initialAttributeName","reloadPlugin","removeComponentFromDynamicZone","dzName","componentToRemoveIndex","removeField","attributeToRemoveName","attributeToRemoveIndex","targetAttributeName","targetContentType","targetAttributeIndex","targetField","updateComponentSchema","updateComponentUid","newComponentUID","newType","updateSchema","previousKind","oldSection","deleteComponent","deleteContentType","createFolder","rawName","parentId","MAX_FOLDER_DEPTH","isFolderNameTakenBySibling","renameFolder","moveFolder","newParentId","newTopDepth","oldParent","newParent","entry","currentIndex","candidate","moved","rootIds","anchorId","insertAt","deleteFolderOnly","groupToDeleteId","groupToDelete","groupToDeleteParentId","getDeleteFolderOnlySiblingNameCollisions","childGroup","groupToDeleteParent","groupToDeleteIndex","deleteFolderAndContent","contentTypeUids","toRemove","Set","collect","currentGroupId","add","currentGroup","has","assignContentTypeToFolder","reorderFolderChildren","groupId","applyChange","reducerAction","schema","isComponent","exists","isUnsaved","limit","excludeActionsFromHistory","stateSelector","discard","reducer","actions"],"mappings":"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"}
@@ -1,10 +1,12 @@
1
1
  import merge from 'lodash/merge';
2
2
  import omit from 'lodash/omit';
3
+ import uniq from 'lodash/uniq';
3
4
  import { applyPrivateSearchDefault } from '../../utils/applyPrivateSearchDefault.mjs';
4
5
  import { getRelationType } from '../../utils/getRelationType.mjs';
5
6
  import { makeUnique } from '../../utils/makeUnique.mjs';
6
7
  import { createUndoRedoSlice } from './undoRedo.mjs';
7
8
  import { sectionKeyForKind, getDeleteFolderOnlySiblingNameCollisions, MAX_FOLDER_DEPTH, isFolderNameTakenBySibling, createEmptyContentStructure, findSiblingFolderByName } from './utils/contentStructure.mjs';
9
+ import { isStorageCompatibleRename } from './utils/isStorageCompatibleRename.mjs';
8
10
 
9
11
  const initialState = {
10
12
  components: {},
@@ -73,6 +75,65 @@ const createAttribute = (properties)=>{
73
75
  status: 'NEW'
74
76
  };
75
77
  };
78
+ /**
79
+ * Records an attribute rename hop in the order the user performed it, so the
80
+ * server can replay the exact path as a data-preserving migration.
81
+ *
82
+ * - Only renames of fields that already exist in the database are recorded; a
83
+ * brand-new field (status NEW) has no data yet, so its renames are ignored.
84
+ * - A rename that also changes the field's type / relation / component is not
85
+ * recorded (see `isStorageCompatibleRename`).
86
+ * - Each hop (`previousName -> newName`) is appended verbatim. The recorded
87
+ * sequence is inherently collision-free because the CTB never allows two
88
+ * fields to share a name — a "swap" is expressed through the user's own
89
+ * intermediate-name hop, so no synthetic temp column is ever needed.
90
+ */ const recordRename = (type, previousAttribute, newAttribute)=>{
91
+ if (previousAttribute.status === 'NEW') {
92
+ return;
93
+ }
94
+ const oldName = previousAttribute.name;
95
+ const newName = newAttribute?.name;
96
+ if (!newName || oldName === newName) {
97
+ return;
98
+ }
99
+ if (!isStorageCompatibleRename(previousAttribute, newAttribute)) {
100
+ return;
101
+ }
102
+ if (!type.renames) {
103
+ type.renames = [];
104
+ }
105
+ type.renames.push({
106
+ oldName,
107
+ newName
108
+ });
109
+ };
110
+ /**
111
+ * Remembers the names of a rename hop the user declined to preserve data for,
112
+ * so the rest of that chain is declined without another prompt.
113
+ */ const recordDeclinedRename = (type, previousAttribute, newAttribute)=>{
114
+ const oldName = previousAttribute.name;
115
+ const newName = newAttribute?.name;
116
+ if (!newName || oldName === newName) {
117
+ return;
118
+ }
119
+ type.declinedRenameNames = uniq([
120
+ ...type.declinedRenameNames ?? [],
121
+ oldName,
122
+ newName
123
+ ]);
124
+ };
125
+ /**
126
+ * Applies the rename consent carried by an edit: either records the hop or
127
+ * remembers it as declined. Never both.
128
+ */ const applyRenameConsent = (type, previousAttribute, newAttribute, { recordRename: shouldRecordRename = true, declineRename: shouldDecline = false })=>{
129
+ if (shouldDecline) {
130
+ recordDeclinedRename(type, previousAttribute, newAttribute);
131
+ return;
132
+ }
133
+ if (shouldRecordRename) {
134
+ recordRename(type, previousAttribute, newAttribute);
135
+ }
136
+ };
76
137
  const setAttributeAt = (type, index, attribute)=>{
77
138
  const previousAttribute = type.attributes[index];
78
139
  const newStatus = getNewStatus(previousAttribute.status, 'CHANGED');
@@ -112,6 +173,30 @@ const removeAttributeByName = (type, name)=>{
112
173
  setAttributeStatus(attr, 'REMOVED');
113
174
  }
114
175
  };
176
+ /**
177
+ * Carries the pending rename state of `existing` over to a full replacement of
178
+ * the type (the AI chat's `applyChange`). Appending the incoming hops after the
179
+ * existing ones is order-correct: the chat transform diffs against the current
180
+ * reducer entry, whose attributes already carry the manual renames, so its hops
181
+ * start from where the manual hops ended.
182
+ */ const mergeRenameState = (existing, incoming)=>{
183
+ const renames = [
184
+ ...existing?.renames ?? [],
185
+ ...incoming.renames ?? []
186
+ ];
187
+ const declinedRenameNames = uniq([
188
+ ...existing?.declinedRenameNames ?? [],
189
+ ...incoming.declinedRenameNames ?? []
190
+ ]);
191
+ return {
192
+ ...renames.length > 0 ? {
193
+ renames
194
+ } : {},
195
+ ...declinedRenameNames.length > 0 ? {
196
+ declinedRenameNames
197
+ } : {}
198
+ };
199
+ };
115
200
  const updateType = (type, data)=>{
116
201
  merge(type, data);
117
202
  setStatus(type, 'CHANGED');
@@ -401,7 +486,7 @@ const slice = createUndoRedoSlice({
401
486
  attr.components = updatedComponents;
402
487
  },
403
488
  editAttribute: (state, action)=>{
404
- const { name, attributeToSet, forTarget, targetUid } = action.payload;
489
+ const { name, attributeToSet, forTarget, targetUid, recordRename, declineRename, recordTargetRename, declineTargetRename } = action.payload;
405
490
  const type = getType(state, {
406
491
  forTarget,
407
492
  targetUid
@@ -411,6 +496,10 @@ const slice = createUndoRedoSlice({
411
496
  return;
412
497
  }
413
498
  const previousAttribute = type.attributes[initialAttributeIndex];
499
+ applyRenameConsent(type, previousAttribute, attributeToSet, {
500
+ recordRename,
501
+ declineRename
502
+ });
414
503
  setAttributeAt(type, initialAttributeIndex, attributeToSet);
415
504
  if (previousAttribute.type !== attributeToSet.type) {
416
505
  return;
@@ -450,6 +539,14 @@ const slice = createUndoRedoSlice({
450
539
  };
451
540
  // create or recreate(at old index) targetAttribute
452
541
  if (previousTargetAttributeIndex !== -1 && previousTarget.uid === newTarget.uid) {
542
+ // The counterpart is renamed on the target type: without a hop
543
+ // there, the side owning the join table would lose its links.
544
+ if (previousTargetAttribute) {
545
+ applyRenameConsent(newTarget, previousTargetAttribute, newTargetAttribute, {
546
+ recordRename: recordTargetRename,
547
+ declineRename: declineTargetRename
548
+ });
549
+ }
453
550
  // re-create at previousIdx if possible
454
551
  replaceAttributeAt(newTarget, previousTargetAttributeIndex, newTargetAttribute);
455
552
  } else {
@@ -461,14 +558,19 @@ const slice = createUndoRedoSlice({
461
558
  }
462
559
  },
463
560
  editCustomFieldAttribute: (state, action)=>{
464
- const { forTarget, targetUid, name, attributeToSet } = action.payload;
561
+ const { forTarget, targetUid, name, attributeToSet, recordRename, declineRename } = action.payload;
465
562
  const initialAttributeName = name;
466
563
  const type = getType(state, {
467
564
  forTarget,
468
565
  targetUid
469
566
  });
470
567
  const initialAttributeIndex = findAttributeIndex(type, initialAttributeName);
568
+ const previousAttribute = type.attributes[initialAttributeIndex];
471
569
  setAttributeAt(type, initialAttributeIndex, attributeToSet);
570
+ applyRenameConsent(type, previousAttribute, attributeToSet, {
571
+ recordRename,
572
+ declineRename
573
+ });
472
574
  },
473
575
  reloadPlugin: ()=>{
474
576
  return initialState;
@@ -887,6 +989,7 @@ const slice = createUndoRedoSlice({
887
989
  const component = state.components[uid];
888
990
  state.components[uid] = {
889
991
  ...schema,
992
+ ...mergeRenameState(component, schema),
890
993
  status: component?.status === 'NEW' ? 'NEW' : schema.status
891
994
  };
892
995
  } else {
@@ -894,6 +997,7 @@ const slice = createUndoRedoSlice({
894
997
  const previousKind = contentType?.kind;
895
998
  state.contentTypes[uid] = {
896
999
  ...schema,
1000
+ ...mergeRenameState(contentType, schema),
897
1001
  status: contentType?.status === 'NEW' ? 'NEW' : schema.status
898
1002
  };
899
1003
  if (previousKind && schema.kind && schema.kind !== previousKind) {