@strapi/content-type-builder 5.56.0 → 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.
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js +117 -13
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.js.map +1 -1
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs +118 -13
- package/dist/admin/components/AIChat/lib/transforms/schemas/toCTB.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +31 -19
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +31 -19
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerContext.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +166 -6
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +165 -7
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/RenameMigrationModal.js +285 -0
- package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -0
- package/dist/admin/components/DataManager/RenameMigrationModal.mjs +257 -0
- package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -0
- package/dist/admin/components/DataManager/reducer.js +107 -2
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +106 -2
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.js +8 -1
- package/dist/admin/components/DataManager/utils/cleanData.js.map +1 -1
- package/dist/admin/components/DataManager/utils/cleanData.mjs +8 -1
- package/dist/admin/components/DataManager/utils/cleanData.mjs.map +1 -1
- package/dist/admin/components/DataManager/utils/groupRenameChains.js +86 -0
- package/dist/admin/components/DataManager/utils/groupRenameChains.js.map +1 -0
- package/dist/admin/components/DataManager/utils/groupRenameChains.mjs +84 -0
- package/dist/admin/components/DataManager/utils/groupRenameChains.mjs.map +1 -0
- package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js +29 -0
- package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.js.map +1 -0
- package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs +27 -0
- package/dist/admin/components/DataManager/utils/isStorageCompatibleRename.mjs.map +1 -0
- package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js +35 -0
- package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.js.map +1 -0
- package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs +33 -0
- package/dist/admin/components/DataManager/utils/resolveAfterEditRenameConsent.mjs.map +1 -0
- package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js +48 -0
- package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.js.map +1 -0
- package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs +45 -0
- package/dist/admin/components/DataManager/utils/splitChainsByInheritedConsent.mjs.map +1 -0
- package/dist/admin/components/FormModal/FormModal.js +142 -8
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +143 -9
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.js +6 -5
- package/dist/admin/components/FormModal/attributes/validation/common.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.mjs +1 -1
- package/dist/admin/components/FormModal/attributes/validation/common.mjs.map +1 -1
- package/dist/admin/components/FormModal/component/createComponentSchema.js +10 -7
- package/dist/admin/components/FormModal/component/createComponentSchema.js.map +1 -1
- package/dist/admin/components/FormModal/component/createComponentSchema.mjs +1 -1
- package/dist/admin/components/FormModal/component/createComponentSchema.mjs.map +1 -1
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js +24 -21
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.js.map +1 -1
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs +1 -1
- package/dist/admin/components/FormModal/contentType/createContentTypeSchema.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.js +3 -2
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.js.map +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs +1 -1
- package/dist/admin/components/FormModal/forms/utils/createCollectionName.mjs.map +1 -1
- package/dist/admin/components/FormModal/utils/getRenameStorageChange.js +73 -0
- package/dist/admin/components/FormModal/utils/getRenameStorageChange.js.map +1 -0
- package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs +70 -0
- package/dist/admin/components/FormModal/utils/getRenameStorageChange.mjs.map +1 -0
- package/dist/admin/src/components/AIChat/lib/transforms/schemas/toCTB.d.ts +4 -3
- package/dist/admin/src/components/AIChat/lib/types/schema.d.ts +6 -1
- package/dist/admin/src/components/DataManager/DataManagerContext.d.ts +28 -2
- package/dist/admin/src/components/DataManager/RenameMigrationModal.d.ts +73 -0
- package/dist/admin/src/components/DataManager/reducer.d.ts +17 -2
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +16 -0
- package/dist/admin/src/components/DataManager/utils/groupRenameChains.d.ts +31 -0
- package/dist/admin/src/components/DataManager/utils/isStorageCompatibleRename.d.ts +10 -0
- package/dist/admin/src/components/DataManager/utils/resolveAfterEditRenameConsent.d.ts +24 -0
- package/dist/admin/src/components/DataManager/utils/splitChainsByInheritedConsent.d.ts +26 -0
- package/dist/admin/src/components/FormModal/utils/getRenameStorageChange.d.ts +40 -0
- package/dist/admin/src/types.d.ts +23 -0
- package/dist/admin/translations/en.json.js +12 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +12 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/config.js +24 -3
- package/dist/server/config.js.map +1 -1
- package/dist/server/config.mjs +21 -3
- package/dist/server/config.mjs.map +1 -1
- package/dist/server/controllers/schema.js +2 -2
- package/dist/server/controllers/schema.js.map +1 -1
- package/dist/server/controllers/schema.mjs +1 -1
- package/dist/server/controllers/schema.mjs.map +1 -1
- package/dist/server/controllers/validation/content-type.js +9 -11
- package/dist/server/controllers/validation/content-type.js.map +1 -1
- package/dist/server/controllers/validation/content-type.mjs +7 -9
- package/dist/server/controllers/validation/content-type.mjs.map +1 -1
- package/dist/server/controllers/validation/model-schema.js +2 -3
- package/dist/server/controllers/validation/model-schema.js.map +1 -1
- package/dist/server/controllers/validation/model-schema.mjs +1 -2
- package/dist/server/controllers/validation/model-schema.mjs.map +1 -1
- package/dist/server/controllers/validation/relations.js +1 -2
- package/dist/server/controllers/validation/relations.js.map +1 -1
- package/dist/server/controllers/validation/relations.mjs +1 -2
- package/dist/server/controllers/validation/relations.mjs.map +1 -1
- package/dist/server/controllers/validation/schema.js +42 -23
- package/dist/server/controllers/validation/schema.js.map +1 -1
- package/dist/server/controllers/validation/schema.mjs +43 -24
- package/dist/server/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/services/content-types.js +1 -2
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +2 -3
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/migration-builder/index.js +580 -0
- package/dist/server/services/migration-builder/index.js.map +1 -0
- package/dist/server/services/migration-builder/index.mjs +573 -0
- package/dist/server/services/migration-builder/index.mjs.map +1 -0
- package/dist/server/services/schema-builder/content-type-builder.js +31 -1
- package/dist/server/services/schema-builder/content-type-builder.js.map +1 -1
- package/dist/server/services/schema-builder/content-type-builder.mjs +31 -1
- package/dist/server/services/schema-builder/content-type-builder.mjs.map +1 -1
- package/dist/server/services/schema-mutation.js +30 -2
- package/dist/server/services/schema-mutation.js.map +1 -1
- package/dist/server/services/schema-mutation.mjs +10 -2
- package/dist/server/services/schema-mutation.mjs.map +1 -1
- package/dist/server/services/schema.js +259 -15
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/services/schema.mjs +252 -9
- package/dist/server/services/schema.mjs.map +1 -1
- package/dist/server/src/config.d.ts +23 -2
- package/dist/server/src/config.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-type.d.ts +0 -1
- package/dist/server/src/controllers/validation/content-type.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/schema.d.ts +28 -0
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +10 -2
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/migration-builder/index.d.ts +83 -0
- package/dist/server/src/services/migration-builder/index.d.ts.map +1 -0
- package/dist/server/src/services/schema-builder/content-type-builder.d.ts.map +1 -1
- package/dist/server/src/services/schema-mutation.d.ts +4 -2
- package/dist/server/src/services/schema-mutation.d.ts.map +1 -1
- package/dist/server/src/services/schema.d.ts +19 -0
- package/dist/server/src/services/schema.d.ts.map +1 -1
- package/package.json +7 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataManagerProvider.js","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\n useGuidedTour,\n GUIDED_TOUR_REQUIRED_ACTIONS,\n} from '@strapi/admin/strapi-admin';\nimport groupBy from 'lodash/groupBy';\nimport isEqual from 'lodash/isEqual';\nimport mapValues from 'lodash/mapValues';\nimport { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { fromServerFile, generateGroupId } from './utils/contentStructure';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\n\nimport type { AnyAttribute, ContentTypes, ContentType, Components } from '../../types';\nimport type { FolderSelection } from './utils/contentStructure';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal, Modules } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Including the new folder state in the same payload as create/edit transactions ensures the\n * folder assignment is subject to the same undo/redo operations as the content type mutation\n */\nconst toFolderAssignment = (folder?: FolderSelection) => {\n if (!folder) {\n return undefined;\n }\n\n if ('newFolderName' in folder) {\n return { newFolderId: generateGroupId(), newFolderName: folder.newFolderName };\n }\n\n return { targetGroupId: folder.targetGroupId };\n};\n\ntype SchemaResponse = {\n data: {\n components: Components;\n contentTypes: ContentTypes;\n contentStructure?: Modules.ContentStructure.ContentStructureFile | null;\n };\n};\n\ntype ReservedNamesResponse = DataManagerContextValue['reservedNames'];\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\n\n/**\n * Tag types registered on the shared `adminApi` instance at runtime by\n * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`\n * (see packages/core/content-manager/admin/src/services/api.ts).\n *\n * The cast is only required because adminApi's compile-time tag union doesn't see\n * tags added downstream from this side of the dependency graph.\n */\nconst CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [\n 'InitialData',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'ComponentConfiguration',\n] as const;\n\nconst invalidateContentManagerSchemaCaches = () =>\n adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS as never);\n\nconst DataManagerProvider = ({ children }: DataManagerProviderProps) => {\n const dispatch = useDispatch();\n const state = useSelector(selectState);\n const dispatchGuidedTour = useGuidedTour('DataManagerProvider', (s) => s.dispatch);\n const location = useLocation();\n const { sessionId: ctbSessionId, regenerateSessionId } = useCTBSession();\n\n const {\n components,\n contentTypes,\n reservedNames,\n initialComponents,\n initialContentTypes,\n contentStructure,\n initialContentStructure,\n isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(\n isEqual(components, initialComponents) &&\n isEqual(contentTypes, initialContentTypes) &&\n isEqual(contentStructure, initialContentStructure)\n );\n }, [\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n contentStructure,\n initialContentStructure,\n ]);\n\n const fetchClient = useFetchClient();\n\n const isInDevelopmentMode = autoReload;\n\n const getDataRef = React.useRef<() => Promise<void>>(async () => undefined);\n\n getDataRef.current = async () => {\n try {\n const [schemaResponse, reservedNamesResponse] = await Promise.all([\n fetchClient.get<SchemaResponse>(`/content-type-builder/schema`),\n fetchClient.get<ReservedNamesResponse>(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes, contentStructure } = schemaResponse.data.data;\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n contentStructure: fromServerFile(contentStructure),\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n contentStructure: state.current.contentStructure,\n initialContentStructure: state.current.initialContentStructure,\n });\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n // Update the app's permissions\n await updatePermissions();\n // Refresh content-manager caches that depend on the CT/component schema.\n dispatch(invalidateContentManagerSchemaCaches());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: false,\n ctbSessionId,\n });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\n dispatchGuidedTour({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema],\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: true,\n ctbSessionId,\n });\n }\n };\n\n const componentsThatHaveOtherComponentInTheirAttributes = React.useMemo(() => {\n return getAllComponentsThatHaveAComponentInTheirAttributes(components);\n }, [components]);\n\n const nestedComponents = React.useMemo(() => {\n return getAllNestedComponents(components);\n }, [components]);\n\n const allComponentsCategories = React.useMemo(() => {\n return retrieveSpecificInfoFromComponents(components, ['category']);\n }, [components]);\n\n const componentsGroupedByCategory = React.useMemo(() => {\n return groupBy(components, 'category');\n }, [components]);\n\n const sortedContentTypesList = React.useMemo(() => {\n return sortContentType(contentTypes);\n }, [contentTypes]);\n\n const context: DataManagerContextValue = {\n componentsThatHaveOtherComponentInTheirAttributes,\n nestedComponents,\n saveSchema,\n reservedNames,\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n contentStructure,\n isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n addAttribute(payload) {\n dispatch(\n actions.addAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n editAttribute(payload) {\n dispatch(\n actions.editAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n addCustomFieldAttribute(payload) {\n dispatch(\n actions.addCustomFieldAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n editCustomFieldAttribute(payload) {\n dispatch(\n actions.editCustomFieldAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n const { folder, ...rest } = payload;\n dispatch(actions.createSchema({ ...rest, folder: toFolderAssignment(folder) }));\n },\n createComponentSchema({ data, uid, componentCategory }) {\n dispatch(actions.createComponentSchema({ data, uid, componentCategory }));\n },\n changeDynamicZoneComponents({ forTarget, targetUid, dynamicZoneTarget, newComponents }) {\n dispatch(\n actions.changeDynamicZoneComponents({\n forTarget,\n targetUid,\n dynamicZoneTarget,\n newComponents,\n })\n );\n },\n removeAttribute(payload) {\n if (payload.forTarget === 'contentType') {\n // Note: willDeleteFieldOfContentType doesn't accept properties\n trackUsage('willDeleteFieldOfContentType');\n }\n\n dispatch(actions.removeField(payload));\n },\n removeComponentFromDynamicZone(payload) {\n dispatch(actions.removeComponentFromDynamicZone(payload));\n },\n deleteComponent(uid: Internal.UID.Component) {\n const userConfirm = window.confirm(\n formatMessage({\n id: getTrad(`popUpWarning.bodyMessage.component.delete`),\n })\n );\n\n if (userConfirm) {\n onCloseModal();\n\n dispatch(actions.deleteComponent(uid));\n }\n },\n deleteContentType(uid: Internal.UID.ContentType) {\n const userConfirm = window.confirm(\n formatMessage({\n id: getTrad(`popUpWarning.bodyMessage.contentType.delete`),\n })\n );\n\n if (userConfirm) {\n onCloseModal();\n\n dispatch(actions.deleteContentType(uid));\n }\n },\n\n createFolder({ section, name, parentId }) {\n dispatch(actions.createFolder({ section, name, parentId, id: generateGroupId() }));\n },\n renameFolder(payload) {\n dispatch(actions.renameFolder(payload));\n },\n moveFolder(payload) {\n dispatch(actions.moveFolder(payload));\n },\n deleteFolderOnly(payload) {\n dispatch(actions.deleteFolderOnly(payload));\n },\n deleteFolderAndContent({ section, id, contentTypeUids }) {\n dispatch(actions.deleteFolderAndContent({ section, id, contentTypeUids }));\n },\n assignContentTypeToFolder(payload) {\n dispatch(actions.assignContentTypeToFolder(payload));\n },\n reorderFolderChildren(payload) {\n dispatch(actions.reorderFolderChildren(payload));\n },\n\n updateComponentSchema({ data, componentUID }) {\n dispatch(\n actions.updateComponentSchema({\n data,\n uid: componentUID,\n })\n );\n },\n\n updateComponentUid({ componentUID, newComponentUID }) {\n dispatch(\n actions.updateComponentUid({\n uid: componentUID,\n newComponentUID,\n })\n );\n },\n\n updateSchema(args) {\n const { folder, ...rest } = args;\n dispatch(actions.updateSchema({ ...rest, folder: toFolderAssignment(folder) }));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n applyChange(args) {\n dispatch(actions.applyChange(args));\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return <DataManagerContext.Provider value={context}>{children}</DataManagerContext.Provider>;\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["toFolderAssignment","folder","undefined","newFolderId","generateGroupId","newFolderName","targetGroupId","selectState","state","initialState","CONTENT_MANAGER_SCHEMA_CACHE_TAGS","invalidateContentManagerSchemaCaches","adminApi","util","invalidateTags","DataManagerProvider","children","dispatch","useDispatch","useSelector","dispatchGuidedTour","useGuidedTour","s","location","useLocation","sessionId","ctbSessionId","regenerateSessionId","useCTBSession","components","contentTypes","reservedNames","initialComponents","initialContentTypes","contentStructure","initialContentStructure","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","fromServerFile","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","isSendingContentTypes","keys","length","post","success","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","attributeToSet","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","rest","createComponentSchema","componentCategory","changeDynamicZoneComponents","forTarget","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","createFolder","section","name","parentId","renameFolder","moveFolder","deleteFolderOnly","deleteFolderAndContent","contentTypeUids","assignContentTypeToFolder","reorderFolderChildren","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsx","DataManagerContext","Provider","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA;;;IAIA,MAAMA,qBAAqB,CAACC,MAAAA,GAAAA;AAC1B,IAAA,IAAI,CAACA,MAAAA,EAAQ;QACX,OAAOC,SAAAA;AACT,IAAA;AAEA,IAAA,IAAI,mBAAmBD,MAAAA,EAAQ;QAC7B,OAAO;YAAEE,WAAAA,EAAaC,gCAAAA,EAAAA;AAAmBC,YAAAA,aAAAA,EAAeJ,OAAOI;AAAc,SAAA;AAC/E,IAAA;IAEA,OAAO;AAAEC,QAAAA,aAAAA,EAAeL,OAAOK;AAAc,KAAA;AAC/C,CAAA;AAYA,MAAMC,cAAc,CAACC,KAAAA,GAClBA,KAAK,CAAC,2CAA2C,IAAIC,oBAAAA;AAExD;;;;;;;AAOC,IACD,MAAMC,iCAAAA,GAAoC;AACxC,IAAA,aAAA;AACA,IAAA,2BAAA;AACA,IAAA,qBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,uCAAuC,IAC3CC,oBAAAA,CAASC,IAAI,CAACC,cAAc,CAACJ,iCAAAA,CAAAA;AAE/B,MAAMK,mBAAAA,GAAsB,CAAC,EAAEC,QAAQ,EAA4B,GAAA;AACjE,IAAA,MAAMC,QAAAA,GAAWC,sBAAAA,EAAAA;AACjB,IAAA,MAAMV,QAAQW,sBAAAA,CAAYZ,WAAAA,CAAAA;AAC1B,IAAA,MAAMa,qBAAqBC,yBAAAA,CAAc,qBAAA,EAAuB,CAACC,CAAAA,GAAMA,EAAEL,QAAQ,CAAA;AACjF,IAAA,MAAMM,QAAAA,GAAWC,0BAAAA,EAAAA;AACjB,IAAA,MAAM,EAAEC,SAAAA,EAAWC,YAAY,EAAEC,mBAAmB,EAAE,GAAGC,2BAAAA,EAAAA;AAEzD,IAAA,MAAM,EACJC,UAAU,EACVC,YAAY,EACZC,aAAa,EACbC,iBAAiB,EACjBC,mBAAmB,oBACnBC,kBAAgB,EAChBC,uBAAuB,EACvBC,SAAS,EACV,GAAG5B,MAAM6B,OAAO;IAEjB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,qBAAqB,EAAEC,uBAAuB,EAAE,GAAGC,oDAAAA,EAAAA;AAC3D,IAAA,MAAMC,oBAAAA,GAAuBC,+CAAAA,EAAAA;AAE7B,IAAA,MAAMC,YAAYC,wBAAAA,CAAa,qBAAA,EAAuB,CAACtC,KAAAA,GAAUA,MAAMqC,SAAS,CAAA;AAChF,IAAA,MAAME,SAASF,SAAAA,CAAU,sBAAA,CAAA;AACzB,IAAA,MAAMG,aAAaC,sBAAAA,CAAW,qBAAA,EAAuB,CAACzC,KAAAA,GAAUA,MAAMwC,UAAU,CAAA;IAChF,MAAM,EAAEE,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;AACvB,IAAA,MAAMC,qBAAqBC,mBAAAA,CAAQ,qBAAA,EAAuB,CAAC/C,KAAAA,GAAUA,MAAM8C,kBAAkB,CAAA;IAC7F,MAAM,EAAEE,YAAY,EAAE,GAAGC,6CAAAA,EAAAA;AAEzB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IAC/C,MAAMC,mBAAAA,GAAsBF,gBAAAA,CAAMG,MAAM,CAAgB,IAAA,CAAA;IAExD,MAAMC,UAAAA,GAAaJ,gBAAAA,CAAMK,OAAO,CAAC,IAAA;QAC/B,OAAO,EACLC,wBAAAA,CAAQrC,UAAAA,EAAYG,iBAAAA,CAAAA,IACpBkC,yBAAQpC,YAAAA,EAAcG,mBAAAA,CAAAA,IACtBiC,wBAAAA,CAAQhC,kBAAAA,EAAkBC,uBAAAA,CAAuB,CAAA;IAErD,CAAA,EAAG;AACDN,QAAAA,UAAAA;AACAC,QAAAA,YAAAA;AACAE,QAAAA,iBAAAA;AACAC,QAAAA,mBAAAA;AACAC,QAAAA,kBAAAA;AACAC,QAAAA;AACD,KAAA,CAAA;AAED,IAAA,MAAMgC,WAAAA,GAAcC,0BAAAA,EAAAA;AAEpB,IAAA,MAAMC,mBAAAA,GAAsBrB,UAAAA;AAE5B,IAAA,MAAMsB,UAAAA,GAAaV,gBAAAA,CAAMG,MAAM,CAAsB,UAAY7D,SAAAA,CAAAA;AAEjEoE,IAAAA,UAAAA,CAAWjC,OAAO,GAAG,UAAA;QACnB,IAAI;AACF,YAAA,MAAM,CAACkC,cAAAA,EAAgBC,qBAAAA,CAAsB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AAChEP,gBAAAA,WAAAA,CAAYQ,GAAG,CAAiB,CAAC,4BAA4B,CAAC,CAAA;AAC9DR,gBAAAA,WAAAA,CAAYQ,GAAG,CAAwB,CAAC,oCAAoC,CAAC;AAC9E,aAAA,CAAA;YAED,MAAM,EAAE9C,UAAU,EAAEC,YAAY,oBAAEI,kBAAgB,EAAE,GAAGqC,cAAAA,CAAeK,IAAI,CAACA,IAAI;YAE/E3D,QAAAA,CACE4D,eAAAA,CAAQC,IAAI,CAAC;AACXjD,gBAAAA,UAAAA,EAAYkD,0BAAAA,CAAUlD,UAAAA,EAAY,CAACmD,SAAAA,IAAe;AAChD,wBAAA,GAAGA,SAAS;wBACZC,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAnD,gBAAAA,YAAAA,EAAciD,0BAAAA,CAAUjD,YAAAA,EAAc,CAACoD,WAAAA,IAAiB;AACtD,wBAAA,GAAGA,WAAW;wBACdD,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAlD,gBAAAA,aAAAA,EAAeyC,sBAAsBI,IAAI;AACzC1C,gBAAAA,gBAAAA,EAAkBiD,+BAAAA,CAAejD,kBAAAA;AACnC,aAAA,CAAA,CAAA;AAGFjB,YAAAA,QAAAA,CAAS4D,gBAAQO,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAOC,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB/C,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;oBAAEwC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA/B,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;AACdtB,QAAAA,UAAAA,CAAWjC,OAAO,EAAA;QAClByB,mBAAAA,CAAoBzB,OAAO,GAAGd,QAAAA,CAASsE,QAAQ;QAE/C,OAAO,IAAA;;AAEL5E,YAAAA,QAAAA,CAAS4D,gBAAQiB,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA;;AAEF,IAAA,CAAA,EAAG,EAAE,CAAA;;AAGLlC,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;QACd,MAAMG,WAAAA,GAAcxE,SAASsE,QAAQ;QACrC,MAAMG,YAAAA,GAAelC,oBAAoBzB,OAAO;AAChD,QAAA,MAAM4D,QAAAA,GAAW,+BAAA;AAEjB,QAAA,IAAID,YAAAA,EAAc;YAChB,MAAME,SAAAA,GAAYH,WAAAA,CAAYI,QAAQ,CAACF,QAAAA,CAAAA;YACvC,MAAMG,UAAAA,GAAaJ,YAAAA,CAAaG,QAAQ,CAACF,QAAAA,CAAAA;;YAGzC,IAAI,CAACG,cAAcF,SAAAA,EAAW;AAC5BvE,gBAAAA,mBAAAA,EAAAA;AACF,YAAA;AACF,QAAA;AAEAmC,QAAAA,mBAAAA,CAAoBzB,OAAO,GAAG0D,WAAAA;IAChC,CAAA,EAAG;AAACxE,QAAAA,QAAAA,CAASsE,QAAQ;AAAElE,QAAAA;AAAoB,KAAA,CAAA;AAE3CiC,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAAC5C,UAAAA,EAAY;YACfV,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,MAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;AAAEwC,oBAAAA,EAAAA,EAAIW,eAAAA,CAAQ,uCAAA;AAAyC,iBAAA;AAChF,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACrD,QAAAA,UAAAA;AAAYV,QAAAA,kBAAAA;AAAoBY,QAAAA;AAAc,KAAA,CAAA;AAElD,IAAA,MAAMoD,sDAAsD,CAACzE,UAAAA,GAAAA;AAC3D,QAAA,MAAM0E,mBAAmBC,yEAAAA,CAAqC3E,UAAAA,CAAAA;QAE9D,OAAO0E,gBAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,yBAAyB,CAAC5E,UAAAA,GAAAA;AAC9B,QAAA,MAAM6E,iBAAiBC,iDAAAA,CAAyB9E,UAAAA,CAAAA;QAEhD,OAAO6E,cAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,iBAAAA,GAAoB,UAAA;QACxB,MAAMtD,kBAAAA,EAAAA;AACR,IAAA,CAAA;AAEA,IAAA,MAAMuD,UAAAA,GAAa,UAAA;QACjBlD,WAAAA,CAAY,IAAA,CAAA;QAEZ,MAAMmD,WAAAA,GAAc/D,QAAQgE,IAAAA,EAAMC,KAAAA;AAElC,QAAA,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAAC3G,MAAM6B,OAAO,CAACP,YAAY,CAAA,CAAEsF,MAAM,CAClE,CAACC,GAAAA,EAAK,CAACC,KAAKpC,WAAAA,CAAY,GAAA;YACtBmC,GAAG,CAACC,IAAI,GAAGR,WAAAA,CAAYS,uBAAuB,CAC5CrC,WAAAA,EACAjD,mBAAmB,CAACqF,GAAAA,CAAI,CAAA;YAG1B,OAAOD,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAGH,QAAA,MAAM,EAAEG,WAAW,EAAEC,uBAAuB,EAAE,GAAGC,4BAAAA,CAAmB;YAClE7F,UAAAA,EAAYrB,KAAAA,CAAM6B,OAAO,CAACR,UAAU;YACpCC,YAAAA,EAAcmF,UAAAA;YACd/E,gBAAAA,EAAkB1B,KAAAA,CAAM6B,OAAO,CAACH,gBAAgB;YAChDC,uBAAAA,EAAyB3B,KAAAA,CAAM6B,OAAO,CAACF;AACzC,SAAA,CAAA;;AAGAiB,QAAAA,UAAAA,CAAW,qBAAA,EAAuB;AAChC,YAAA,GAAGqE,uBAAuB;AAC1B/F,YAAAA;AACF,SAAA,CAAA;QAEA,MAAMiG,qBAAAA,GAAwBT,MAAAA,CAAOU,IAAI,CAACpH,KAAAA,CAAM6B,OAAO,CAACP,YAAY,CAAA,CAAE+F,MAAM,GAAG,CAAA;AAE/ErF,QAAAA,qBAAAA,EAAAA;QAEA,IAAI;AACF,YAAA,MAAM2B,YAAY2D,IAAI,CAAC,CAAC,mCAAmC,CAAC,EAAE;gBAAElD,IAAAA,EAAM4C;AAAY,aAAA,CAAA;AAElF,YAAA,IAAIG,qBAAAA,EAAuB;;gBAEzBvE,UAAAA,CAAW,mCAAA,CAAA;AACb,YAAA;;YAGA,MAAMT,oBAAAA,EAAAA;;AAENhB,YAAAA,mBAAAA,EAAAA;;AAEA,YAAA,MAAM2C,WAAWjC,OAAO,EAAA;;YAExB,MAAMuE,iBAAAA,EAAAA;;YAEN3F,QAAAA,CAASN,oCAAAA,EAAAA,CAAAA;AACX,QAAA,CAAA,CAAE,OAAO0E,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB/C,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;oBAAEwC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AAEAvC,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGqE,uBAAuB;gBAC1BM,OAAAA,EAAS,KAAA;AACTrG,gBAAAA;AACF,aAAA,CAAA;QACF,CAAA,QAAU;YACRiC,WAAAA,CAAY,KAAA,CAAA;AACZlB,YAAAA,uBAAAA,EAAAA;AAEAxB,YAAAA,QAAAA,CAASL,oBAAAA,CAASC,IAAI,CAACC,cAAc,CAAC;AAAC,gBAAA,gBAAA;AAAkB,gBAAA;AAAwB,aAAA,CAAA,CAAA;YACjFM,kBAAAA,CAAmB;gBACjBoE,IAAAA,EAAM,uBAAA;gBACNwC,OAAAA,EAAS;oBAACC,wCAAAA,CAA6BC,kBAAkB,CAACC;AAAa;AACzE,aAAA,CAAA;AAEA/E,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGqE,uBAAuB;gBAC1BM,OAAAA,EAAS,IAAA;AACTrG,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,MAAM0G,iDAAAA,GAAoDxE,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AACtE,QAAA,OAAOqC,mDAAAA,CAAoDzE,UAAAA,CAAAA;IAC7D,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMwG,gBAAAA,GAAmBzE,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AACrC,QAAA,OAAOwC,sBAAAA,CAAuB5E,UAAAA,CAAAA;IAChC,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMyG,uBAAAA,GAA0B1E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAC5C,QAAA,OAAOsE,sEAAmC1G,UAAAA,EAAY;AAAC,YAAA;AAAW,SAAA,CAAA;IACpE,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAM2G,2BAAAA,GAA8B5E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAChD,QAAA,OAAOwE,yBAAQ5G,UAAAA,EAAY,UAAA,CAAA;IAC7B,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAM6G,sBAAAA,GAAyB9E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAC3C,QAAA,OAAO0E,yBAAAA,CAAgB7G,YAAAA,CAAAA;IACzB,CAAA,EAAG;AAACA,QAAAA;AAAa,KAAA,CAAA;AAEjB,IAAA,MAAM8G,OAAAA,GAAmC;AACvCR,QAAAA,iDAAAA;AACAC,QAAAA,gBAAAA;AACAxB,QAAAA,UAAAA;AACA9E,QAAAA,aAAAA;AACAF,QAAAA,UAAAA;AACAC,QAAAA,YAAAA;AACAE,QAAAA,iBAAAA;AACAC,QAAAA,mBAAAA;AACAC,0BAAAA,kBAAAA;AACAwB,QAAAA,QAAAA;AACAM,QAAAA,UAAAA;AACAK,QAAAA,mBAAAA;AACAiE,QAAAA,uBAAAA;AACAE,QAAAA,2BAAAA;AACAE,QAAAA,sBAAAA;AACAtG,QAAAA,SAAAA;AACAyG,QAAAA,YAAAA,CAAAA,CAAab,OAAO,EAAA;YAClB/G,QAAAA,CACE4D,eAAAA,CAAQgE,YAAY,CAAC;AACnB,gBAAA,GAAGb,OAAO;AACVc,gBAAAA,cAAAA,EAAgBd,QAAQc;AAC1B,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAC,QAAAA,aAAAA,CAAAA,CAAcf,OAAO,EAAA;YACnB/G,QAAAA,CACE4D,eAAAA,CAAQkE,aAAa,CAAC;AACpB,gBAAA,GAAGf,OAAO;AACVc,gBAAAA,cAAAA,EAAgBd,QAAQc;AAC1B,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAE,QAAAA,uBAAAA,CAAAA,CAAwBhB,OAAO,EAAA;YAC7B/G,QAAAA,CACE4D,eAAAA,CAAQmE,uBAAuB,CAAC;AAC9B,gBAAA,GAAGhB,OAAO;AACVc,gBAAAA,cAAAA,EAAgBd,QAAQc;AAC1B,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAG,QAAAA,wBAAAA,CAAAA,CAAyBjB,OAAO,EAAA;YAC9B/G,QAAAA,CACE4D,eAAAA,CAAQoE,wBAAwB,CAAC;AAC/B,gBAAA,GAAGjB,OAAO;AACVc,gBAAAA,cAAAA,EAAgBd,QAAQc;AAC1B,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAI,QAAAA,gCAAAA,CAAAA,CAAiClB,OAAO,EAAA;YACtC/G,QAAAA,CAAS4D,eAAAA,CAAQqE,gCAAgC,CAAClB,OAAAA,CAAAA,CAAAA;AACpD,QAAA,CAAA;AACAG,QAAAA,YAAAA,CAAAA,CAAaH,OAAO,EAAA;AAClB,YAAA,MAAM,EAAE/H,MAAM,EAAE,GAAGkJ,MAAM,GAAGnB,OAAAA;YAC5B/G,QAAAA,CAAS4D,eAAAA,CAAQsD,YAAY,CAAC;AAAE,gBAAA,GAAGgB,IAAI;AAAElJ,gBAAAA,MAAAA,EAAQD,kBAAAA,CAAmBC,MAAAA;AAAQ,aAAA,CAAA,CAAA;AAC9E,QAAA,CAAA;AACAmJ,QAAAA,qBAAAA,CAAAA,CAAsB,EAAExE,IAAI,EAAE0C,GAAG,EAAE+B,iBAAiB,EAAE,EAAA;YACpDpI,QAAAA,CAAS4D,eAAAA,CAAQuE,qBAAqB,CAAC;AAAExE,gBAAAA,IAAAA;AAAM0C,gBAAAA,GAAAA;AAAK+B,gBAAAA;AAAkB,aAAA,CAAA,CAAA;AACxE,QAAA,CAAA;QACAC,2BAAAA,CAAAA,CAA4B,EAAEC,SAAS,EAAEC,SAAS,EAAEC,iBAAiB,EAAEC,aAAa,EAAE,EAAA;YACpFzI,QAAAA,CACE4D,eAAAA,CAAQyE,2BAA2B,CAAC;AAClCC,gBAAAA,SAAAA;AACAC,gBAAAA,SAAAA;AACAC,gBAAAA,iBAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAC,QAAAA,eAAAA,CAAAA,CAAgB3B,OAAO,EAAA;YACrB,IAAIA,OAAAA,CAAQuB,SAAS,KAAK,aAAA,EAAe;;gBAEvCnG,UAAAA,CAAW,8BAAA,CAAA;AACb,YAAA;YAEAnC,QAAAA,CAAS4D,eAAAA,CAAQ+E,WAAW,CAAC5B,OAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;AACA6B,QAAAA,8BAAAA,CAAAA,CAA+B7B,OAAO,EAAA;YACpC/G,QAAAA,CAAS4D,eAAAA,CAAQgF,8BAA8B,CAAC7B,OAAAA,CAAAA,CAAAA;AAClD,QAAA,CAAA;AACA8B,QAAAA,eAAAA,CAAAA,CAAgBxC,GAA2B,EAAA;AACzC,YAAA,MAAMyC,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC/G,aAAAA,CAAc;gBACZwC,EAAAA,EAAIW,eAAAA,CAAQ,CAAC,yCAAyC,CAAC;AACzD,aAAA,CAAA,CAAA;AAGF,YAAA,IAAI0D,WAAAA,EAAa;AACfvG,gBAAAA,YAAAA,EAAAA;gBAEAvC,QAAAA,CAAS4D,eAAAA,CAAQiF,eAAe,CAACxC,GAAAA,CAAAA,CAAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA4C,QAAAA,iBAAAA,CAAAA,CAAkB5C,GAA6B,EAAA;AAC7C,YAAA,MAAMyC,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC/G,aAAAA,CAAc;gBACZwC,EAAAA,EAAIW,eAAAA,CAAQ,CAAC,2CAA2C,CAAC;AAC3D,aAAA,CAAA,CAAA;AAGF,YAAA,IAAI0D,WAAAA,EAAa;AACfvG,gBAAAA,YAAAA,EAAAA;gBAEAvC,QAAAA,CAAS4D,eAAAA,CAAQqF,iBAAiB,CAAC5C,GAAAA,CAAAA,CAAAA;AACrC,YAAA;AACF,QAAA,CAAA;AAEA6C,QAAAA,YAAAA,CAAAA,CAAa,EAAEC,OAAO,EAAEC,IAAI,EAAEC,QAAQ,EAAE,EAAA;YACtCrJ,QAAAA,CAAS4D,eAAAA,CAAQsF,YAAY,CAAC;AAAEC,gBAAAA,OAAAA;AAASC,gBAAAA,IAAAA;AAAMC,gBAAAA,QAAAA;gBAAU5E,EAAAA,EAAItF,gCAAAA;AAAkB,aAAA,CAAA,CAAA;AACjF,QAAA,CAAA;AACAmK,QAAAA,YAAAA,CAAAA,CAAavC,OAAO,EAAA;YAClB/G,QAAAA,CAAS4D,eAAAA,CAAQ0F,YAAY,CAACvC,OAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AACAwC,QAAAA,UAAAA,CAAAA,CAAWxC,OAAO,EAAA;YAChB/G,QAAAA,CAAS4D,eAAAA,CAAQ2F,UAAU,CAACxC,OAAAA,CAAAA,CAAAA;AAC9B,QAAA,CAAA;AACAyC,QAAAA,gBAAAA,CAAAA,CAAiBzC,OAAO,EAAA;YACtB/G,QAAAA,CAAS4D,eAAAA,CAAQ4F,gBAAgB,CAACzC,OAAAA,CAAAA,CAAAA;AACpC,QAAA,CAAA;AACA0C,QAAAA,sBAAAA,CAAAA,CAAuB,EAAEN,OAAO,EAAE1E,EAAE,EAAEiF,eAAe,EAAE,EAAA;YACrD1J,QAAAA,CAAS4D,eAAAA,CAAQ6F,sBAAsB,CAAC;AAAEN,gBAAAA,OAAAA;AAAS1E,gBAAAA,EAAAA;AAAIiF,gBAAAA;AAAgB,aAAA,CAAA,CAAA;AACzE,QAAA,CAAA;AACAC,QAAAA,yBAAAA,CAAAA,CAA0B5C,OAAO,EAAA;YAC/B/G,QAAAA,CAAS4D,eAAAA,CAAQ+F,yBAAyB,CAAC5C,OAAAA,CAAAA,CAAAA;AAC7C,QAAA,CAAA;AACA6C,QAAAA,qBAAAA,CAAAA,CAAsB7C,OAAO,EAAA;YAC3B/G,QAAAA,CAAS4D,eAAAA,CAAQgG,qBAAqB,CAAC7C,OAAAA,CAAAA,CAAAA;AACzC,QAAA,CAAA;AAEA8C,QAAAA,qBAAAA,CAAAA,CAAsB,EAAElG,IAAI,EAAEmG,YAAY,EAAE,EAAA;YAC1C9J,QAAAA,CACE4D,eAAAA,CAAQiG,qBAAqB,CAAC;AAC5BlG,gBAAAA,IAAAA;gBACA0C,GAAAA,EAAKyD;AACP,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,kBAAAA,CAAAA,CAAmB,EAAED,YAAY,EAAEE,eAAe,EAAE,EAAA;YAClDhK,QAAAA,CACE4D,eAAAA,CAAQmG,kBAAkB,CAAC;gBACzB1D,GAAAA,EAAKyD,YAAAA;AACLE,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,YAAAA,CAAAA,CAAaC,IAAI,EAAA;AACf,YAAA,MAAM,EAAElL,MAAM,EAAE,GAAGkJ,MAAM,GAAGgC,IAAAA;YAC5BlK,QAAAA,CAAS4D,eAAAA,CAAQqG,YAAY,CAAC;AAAE,gBAAA,GAAG/B,IAAI;AAAElJ,gBAAAA,MAAAA,EAAQD,kBAAAA,CAAmBC,MAAAA;AAAQ,aAAA,CAAA,CAAA;AAC9E,QAAA,CAAA;AAEAmL,QAAAA,aAAAA,CAAAA,CAAcD,IAAI,EAAA;YAChBlK,QAAAA,CAAS4D,eAAAA,CAAQuG,aAAa,CAACD,IAAAA,CAAAA,CAAAA;AACjC,QAAA,CAAA;AAEAE,QAAAA,WAAAA,CAAAA,CAAYF,IAAI,EAAA;YACdlK,QAAAA,CAAS4D,eAAAA,CAAQwG,WAAW,CAACF,IAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;QAEAG,OAAAA,EAAS;AACPC,YAAAA,IAAAA,CAAAA,GAAAA;AACEtK,gBAAAA,QAAAA,CAAS4D,gBAAQ0G,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,IAAAA,CAAAA,GAAAA;AACEvK,gBAAAA,QAAAA,CAAS4D,gBAAQ2G,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,iBAAAA,CAAAA,GAAAA;AACExK,gBAAAA,QAAAA,CAAS4D,gBAAQ6G,UAAU,EAAA,CAAA;AAC7B,YAAA,CAAA;AAEAC,YAAAA,OAAAA,EAASnL,KAAAA,CAAMoL,IAAI,CAAC/D,MAAM,GAAG,CAAA;AAC7BgE,YAAAA,OAAAA,EAASrL,KAAAA,CAAMsL,MAAM,CAACjE,MAAM,GAAG,CAAA;YAC/BkE,aAAAA,EAAe/H;AACjB;AACF,KAAA;IAEA,qBAAOgI,cAAA,CAACC,sCAAmBC,QAAQ,EAAA;QAACC,KAAAA,EAAOvD,OAAAA;AAAU5H,QAAAA,QAAAA,EAAAA;;AACvD;;;;"}
|
|
1
|
+
{"version":3,"file":"DataManagerProvider.js","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\n useGuidedTour,\n GUIDED_TOUR_REQUIRED_ACTIONS,\n} from '@strapi/admin/strapi-admin';\nimport groupBy from 'lodash/groupBy';\nimport isEqual from 'lodash/isEqual';\nimport mapValues from 'lodash/mapValues';\nimport omit from 'lodash/omit';\nimport uniq from 'lodash/uniq';\nimport { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport {\n RenameMigrationModal,\n applyRenameDecisions,\n collectPendingRenames,\n filterRenamesByAcceptedChains,\n shouldPromptForRenamesBeforeSave,\n toPendingRename,\n type AttributeRenameMigrationMode,\n type PendingRename,\n} from './RenameMigrationModal';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { fromServerFile, generateGroupId } from './utils/contentStructure';\nimport { groupRenameChains } from './utils/groupRenameChains';\nimport { resolveAfterEditRenameConsent } from './utils/resolveAfterEditRenameConsent';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\nimport {\n namesOfChains,\n splitChainsByInheritedConsent,\n} from './utils/splitChainsByInheritedConsent';\n\nimport type { AnyAttribute, Component, ContentTypes, ContentType, Components } from '../../types';\nimport type { FolderSelection } from './utils/contentStructure';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal, Modules } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\n/**\n * Including the new folder state in the same payload as create/edit transactions ensures the\n * folder assignment is subject to the same undo/redo operations as the content type mutation\n */\nconst toFolderAssignment = (folder?: FolderSelection) => {\n if (!folder) {\n return undefined;\n }\n\n if ('newFolderName' in folder) {\n return { newFolderId: generateGroupId(), newFolderName: folder.newFolderName };\n }\n\n return { targetGroupId: folder.targetGroupId };\n};\n\ntype SchemaResponse = {\n data: {\n components: Components;\n contentTypes: ContentTypes;\n contentStructure?: Modules.ContentStructure.ContentStructureFile | null;\n settings?: {\n renameMigrations?: {\n attributes?: AttributeRenameMigrationMode;\n };\n };\n };\n};\n\ntype ReservedNamesResponse = DataManagerContextValue['reservedNames'];\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\n\n/**\n * Tag types registered on the shared `adminApi` instance at runtime by\n * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`\n * (see packages/core/content-manager/admin/src/services/api.ts).\n *\n * The cast is only required because adminApi's compile-time tag union doesn't see\n * tags added downstream from this side of the dependency graph.\n */\nconst CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [\n 'InitialData',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'ComponentConfiguration',\n // Existing cached documents still use the pre-change field names.\n 'Document',\n] as const;\n\nconst invalidateContentManagerSchemaCaches = () =>\n adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS as never);\n\nconst DataManagerProvider = ({ children }: DataManagerProviderProps) => {\n const dispatch = useDispatch();\n const state = useSelector(selectState);\n const dispatchGuidedTour = useGuidedTour('DataManagerProvider', (s) => s.dispatch);\n const location = useLocation();\n const { sessionId: ctbSessionId, regenerateSessionId } = useCTBSession();\n\n const {\n components,\n contentTypes,\n reservedNames,\n initialComponents,\n initialContentTypes,\n contentStructure,\n initialContentStructure,\n isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const renameMigrationModeRef = React.useRef<AttributeRenameMigrationMode>('prompt-before-save');\n\n // When `modal` mode prompts the user, we hold the pending renames plus the\n // promise resolver here so `saveSchema` can await the decision.\n const [renameModal, setRenameModal] = React.useState<{\n renames: PendingRename[];\n resolve: (_acceptedKeys: Set<string> | null) => void;\n } | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(\n isEqual(components, initialComponents) &&\n isEqual(contentTypes, initialContentTypes) &&\n isEqual(contentStructure, initialContentStructure)\n );\n }, [\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n contentStructure,\n initialContentStructure,\n ]);\n\n const fetchClient = useFetchClient();\n\n const isInDevelopmentMode = autoReload;\n\n const getDataRef = React.useRef<() => Promise<void>>(async () => undefined);\n\n getDataRef.current = async () => {\n try {\n const [schemaResponse, reservedNamesResponse] = await Promise.all([\n fetchClient.get<SchemaResponse>(`/content-type-builder/schema`),\n fetchClient.get<ReservedNamesResponse>(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes, contentStructure, settings } = schemaResponse.data.data;\n\n if (settings?.renameMigrations?.attributes) {\n renameMigrationModeRef.current = settings.renameMigrations.attributes;\n }\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n contentStructure: fromServerFile(contentStructure),\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const requestRenameDecision = async (renames: PendingRename[]) => {\n const acceptedKeys = await new Promise<Set<string> | null>((resolve) => {\n setRenameModal({ renames, resolve });\n });\n setRenameModal(null);\n\n return acceptedKeys;\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n contentStructure: state.current.contentStructure,\n initialContentStructure: state.current.initialContentStructure,\n });\n\n if (shouldPromptForRenamesBeforeSave(renameMigrationModeRef.current)) {\n const pendingRenames = collectPendingRenames(requestData);\n\n if (pendingRenames.length > 0) {\n const acceptedKeys = await requestRenameDecision(pendingRenames);\n\n // The user cancelled the whole save — return to editing untouched.\n if (acceptedKeys === null) {\n setIsSaving(false);\n return;\n }\n\n applyRenameDecisions(requestData, acceptedKeys);\n }\n }\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n\n // Update the app's permissions\n await updatePermissions();\n // Refresh content-manager caches that depend on the CT/component schema.\n dispatch(invalidateContentManagerSchemaCaches());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: false,\n ctbSessionId,\n });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\n dispatchGuidedTour({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema],\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: true,\n ctbSessionId,\n });\n }\n };\n\n const componentsThatHaveOtherComponentInTheirAttributes = React.useMemo(() => {\n return getAllComponentsThatHaveAComponentInTheirAttributes(components);\n }, [components]);\n\n const nestedComponents = React.useMemo(() => {\n return getAllNestedComponents(components);\n }, [components]);\n\n const allComponentsCategories = React.useMemo(() => {\n return retrieveSpecificInfoFromComponents(components, ['category']);\n }, [components]);\n\n const componentsGroupedByCategory = React.useMemo(() => {\n return groupBy(components, 'category');\n }, [components]);\n\n const sortedContentTypesList = React.useMemo(() => {\n return sortContentType(contentTypes);\n }, [contentTypes]);\n\n const context: DataManagerContextValue = {\n componentsThatHaveOtherComponentInTheirAttributes,\n nestedComponents,\n saveSchema,\n reservedNames,\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n contentStructure,\n isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n attributeRenameMigrationMode: renameMigrationModeRef.current,\n addAttribute(payload) {\n dispatch(\n actions.addAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n editAttribute(payload) {\n dispatch(\n actions.editAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n addCustomFieldAttribute(payload) {\n dispatch(\n actions.addCustomFieldAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n editCustomFieldAttribute(payload) {\n dispatch(\n actions.editCustomFieldAttribute({\n ...payload,\n attributeToSet: payload.attributeToSet as AnyAttribute,\n })\n );\n },\n async confirmAttributeRenameMigration({ forTarget, uid, oldName, newName }) {\n if (oldName === newName) {\n return true;\n }\n\n const schema =\n forTarget === 'contentType'\n ? contentTypes[uid as Internal.UID.ContentType]\n : components[uid as Internal.UID.Component];\n\n // A field that was never saved has no data to preserve: accept without\n // prompting so neither name ends up in `declinedRenameNames`.\n const initialAttribute = schema?.attributes.find((attribute) => attribute.name === oldName);\n if (initialAttribute?.status === 'NEW') {\n return true;\n }\n\n // Consent inherits along a chain: a hop joining an accepted chain is\n // accepted, one touching a declined name is declined, neither prompts.\n const consent = resolveAfterEditRenameConsent({\n renames: schema?.renames ?? [],\n declinedRenameNames: schema?.declinedRenameNames ?? [],\n oldName,\n newName,\n mode: renameMigrationModeRef.current,\n });\n\n if (consent !== 'prompt') {\n return consent === 'accept';\n }\n\n const key = `${uid}:edit`;\n const acceptedKeys = await requestRenameDecision([\n {\n key,\n uid,\n typeName: schema?.info.displayName ?? uid,\n pairs: [{ oldName, newName }],\n via: [],\n },\n ]);\n\n if (acceptedKeys === null) {\n return null;\n }\n\n return acceptedKeys.has(key);\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n const { folder, ...rest } = payload;\n dispatch(actions.createSchema({ ...rest, folder: toFolderAssignment(folder) }));\n },\n createComponentSchema({ data, uid, componentCategory }) {\n dispatch(actions.createComponentSchema({ data, uid, componentCategory }));\n },\n changeDynamicZoneComponents({ forTarget, targetUid, dynamicZoneTarget, newComponents }) {\n dispatch(\n actions.changeDynamicZoneComponents({\n forTarget,\n targetUid,\n dynamicZoneTarget,\n newComponents,\n })\n );\n },\n removeAttribute(payload) {\n if (payload.forTarget === 'contentType') {\n // Note: willDeleteFieldOfContentType doesn't accept properties\n trackUsage('willDeleteFieldOfContentType');\n }\n\n dispatch(actions.removeField(payload));\n },\n removeComponentFromDynamicZone(payload) {\n dispatch(actions.removeComponentFromDynamicZone(payload));\n },\n deleteComponent(uid: Internal.UID.Component) {\n const userConfirm = window.confirm(\n formatMessage({\n id: getTrad(`popUpWarning.bodyMessage.component.delete`),\n })\n );\n\n if (userConfirm) {\n onCloseModal();\n\n dispatch(actions.deleteComponent(uid));\n }\n },\n deleteContentType(uid: Internal.UID.ContentType) {\n const userConfirm = window.confirm(\n formatMessage({\n id: getTrad(`popUpWarning.bodyMessage.contentType.delete`),\n })\n );\n\n if (userConfirm) {\n onCloseModal();\n\n dispatch(actions.deleteContentType(uid));\n }\n },\n\n createFolder({ section, name, parentId }) {\n dispatch(actions.createFolder({ section, name, parentId, id: generateGroupId() }));\n },\n renameFolder(payload) {\n dispatch(actions.renameFolder(payload));\n },\n moveFolder(payload) {\n dispatch(actions.moveFolder(payload));\n },\n deleteFolderOnly(payload) {\n dispatch(actions.deleteFolderOnly(payload));\n },\n deleteFolderAndContent({ section, id, contentTypeUids }) {\n dispatch(actions.deleteFolderAndContent({ section, id, contentTypeUids }));\n },\n assignContentTypeToFolder(payload) {\n dispatch(actions.assignContentTypeToFolder(payload));\n },\n reorderFolderChildren(payload) {\n dispatch(actions.reorderFolderChildren(payload));\n },\n\n updateComponentSchema({ data, componentUID }) {\n dispatch(\n actions.updateComponentSchema({\n data,\n uid: componentUID,\n })\n );\n },\n\n updateComponentUid({ componentUID, newComponentUID }) {\n dispatch(\n actions.updateComponentUid({\n uid: componentUID,\n newComponentUID,\n })\n );\n },\n\n updateSchema(args) {\n const { folder, ...rest } = args;\n dispatch(actions.updateSchema({ ...rest, folder: toFolderAssignment(folder) }));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n async applyChange({ action, schema }) {\n const renames = schema.renames ?? [];\n\n if (action !== 'update' || renames.length === 0) {\n dispatch(actions.applyChange({ action, schema }));\n return true;\n }\n\n const mode = renameMigrationModeRef.current;\n\n if (mode === 'never') {\n dispatch(\n actions.applyChange({\n action,\n schema: omit(schema, ['renames']) as ContentType | Component,\n })\n );\n return true;\n }\n\n // 'always' | 'prompt-before-save': the before-save modal decides per chain.\n if (mode !== 'prompt-after-edit') {\n dispatch(actions.applyChange({ action, schema }));\n return true;\n }\n\n // 'prompt-after-edit': decide per chain now, inheriting consent already\n // given (or refused) for the hops recorded on the type.\n const existing =\n schema.modelType === 'contentType'\n ? contentTypes[schema.uid as Internal.UID.ContentType]\n : components[schema.uid as Internal.UID.Component];\n const chains = groupRenameChains(schema.uid, renames);\n const { keep, prompt } = splitChainsByInheritedConsent({\n recorded: existing?.renames ?? [],\n declinedRenameNames: existing?.declinedRenameNames ?? [],\n chains,\n renames,\n });\n\n const accepted = new Set(keep.map((chain) => chain.id));\n if (prompt.length > 0) {\n const typeName = schema.info?.displayName ?? schema.uid;\n const decision = await requestRenameDecision(\n prompt.map((chain) => toPendingRename(chain, renames, { uid: schema.uid, typeName }))\n );\n\n // The user cancelled: apply nothing.\n if (decision === null) {\n return false;\n }\n\n decision.forEach((id) => accepted.add(id));\n }\n\n const declinedChains = chains.filter((chain) => !accepted.has(chain.id));\n const keptRenames = filterRenamesByAcceptedChains(schema.uid, renames, accepted);\n const declinedRenameNames = uniq([\n ...(schema.declinedRenameNames ?? []),\n ...namesOfChains(declinedChains, renames),\n ]);\n\n dispatch(\n actions.applyChange({\n action,\n schema: {\n ...omit(schema, ['renames', 'declinedRenameNames']),\n ...(keptRenames.length > 0 ? { renames: keptRenames } : {}),\n ...(declinedRenameNames.length > 0 ? { declinedRenameNames } : {}),\n } as ContentType | Component,\n })\n );\n return true;\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return (\n <DataManagerContext.Provider value={context}>\n {children}\n {renameModal && (\n <RenameMigrationModal\n renames={renameModal.renames}\n onConfirm={(acceptedKeys) => renameModal.resolve(acceptedKeys)}\n onCancel={() => renameModal.resolve(null)}\n />\n )}\n </DataManagerContext.Provider>\n );\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["toFolderAssignment","folder","undefined","newFolderId","generateGroupId","newFolderName","targetGroupId","selectState","state","initialState","CONTENT_MANAGER_SCHEMA_CACHE_TAGS","invalidateContentManagerSchemaCaches","adminApi","util","invalidateTags","DataManagerProvider","children","dispatch","useDispatch","useSelector","dispatchGuidedTour","useGuidedTour","s","location","useLocation","sessionId","ctbSessionId","regenerateSessionId","useCTBSession","components","contentTypes","reservedNames","initialComponents","initialContentTypes","contentStructure","initialContentStructure","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","renameMigrationModeRef","renameModal","setRenameModal","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","schemaResponse","reservedNamesResponse","Promise","all","get","settings","data","renameMigrations","attributes","actions","init","mapValues","component","status","contentType","fromServerFile","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","requestRenameDecision","renames","acceptedKeys","resolve","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","shouldPromptForRenamesBeforeSave","pendingRenames","collectPendingRenames","length","applyRenameDecisions","isSendingContentTypes","keys","post","success","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","attributeRenameMigrationMode","addAttribute","attributeToSet","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","confirmAttributeRenameMigration","forTarget","oldName","newName","schema","initialAttribute","find","attribute","name","consent","resolveAfterEditRenameConsent","declinedRenameNames","mode","key","typeName","info","displayName","pairs","via","has","addCreatedComponentToDynamicZone","rest","createComponentSchema","componentCategory","changeDynamicZoneComponents","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","createFolder","section","parentId","renameFolder","moveFolder","deleteFolderOnly","deleteFolderAndContent","contentTypeUids","assignContentTypeToFolder","reorderFolderChildren","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","action","omit","existing","modelType","chains","groupRenameChains","keep","prompt","splitChainsByInheritedConsent","recorded","accepted","Set","map","chain","decision","toPendingRename","forEach","add","declinedChains","filter","keptRenames","filterRenamesByAcceptedChains","uniq","namesOfChains","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsxs","DataManagerContext","Provider","value","_jsx","RenameMigrationModal","onConfirm","onCancel"],"mappings":"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"}
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import * as React from 'react';
|
|
3
3
|
import { useGuidedTour, useNotification, useStrapiApp, useAppInfo, useAuth, useFetchClient, adminApi, GUIDED_TOUR_REQUIRED_ACTIONS } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import groupBy from 'lodash/groupBy';
|
|
5
5
|
import isEqual from 'lodash/isEqual';
|
|
6
6
|
import mapValues from 'lodash/mapValues';
|
|
7
|
+
import omit from 'lodash/omit';
|
|
8
|
+
import uniq from 'lodash/uniq';
|
|
7
9
|
import { useIntl } from 'react-intl';
|
|
8
10
|
import { useDispatch, useSelector } from 'react-redux';
|
|
9
11
|
import { useLocation } from 'react-router-dom';
|
|
@@ -15,12 +17,16 @@ import { useCTBTracking } from '../CTBSession/useCTBTracking.mjs';
|
|
|
15
17
|
import { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation.mjs';
|
|
16
18
|
import { DataManagerContext } from './DataManagerContext.mjs';
|
|
17
19
|
import { initialState, actions } from './reducer.mjs';
|
|
20
|
+
import { RenameMigrationModal, toPendingRename, filterRenamesByAcceptedChains, shouldPromptForRenamesBeforeSave, collectPendingRenames, applyRenameDecisions } from './RenameMigrationModal.mjs';
|
|
18
21
|
import { useServerRestartWatcher } from './useServerRestartWatcher.mjs';
|
|
19
22
|
import { sortContentType, stateToRequestData } from './utils/cleanData.mjs';
|
|
20
23
|
import { fromServerFile, generateGroupId } from './utils/contentStructure.mjs';
|
|
24
|
+
import { groupRenameChains } from './utils/groupRenameChains.mjs';
|
|
25
|
+
import { resolveAfterEditRenameConsent } from './utils/resolveAfterEditRenameConsent.mjs';
|
|
21
26
|
import { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents.mjs';
|
|
22
27
|
import { retrieveNestedComponents } from './utils/retrieveNestedComponents.mjs';
|
|
23
28
|
import { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents.mjs';
|
|
29
|
+
import { splitChainsByInheritedConsent, namesOfChains } from './utils/splitChainsByInheritedConsent.mjs';
|
|
24
30
|
|
|
25
31
|
/**
|
|
26
32
|
* Including the new folder state in the same payload as create/edit transactions ensures the
|
|
@@ -51,7 +57,9 @@ const selectState = (state)=>state['content-type-builder_dataManagerProvider'] |
|
|
|
51
57
|
'InitialData',
|
|
52
58
|
'ContentTypesConfiguration',
|
|
53
59
|
'ContentTypeSettings',
|
|
54
|
-
'ComponentConfiguration'
|
|
60
|
+
'ComponentConfiguration',
|
|
61
|
+
// Existing cached documents still use the pre-change field names.
|
|
62
|
+
'Document'
|
|
55
63
|
];
|
|
56
64
|
const invalidateContentManagerSchemaCaches = ()=>adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS);
|
|
57
65
|
const DataManagerProvider = ({ children })=>{
|
|
@@ -73,6 +81,10 @@ const DataManagerProvider = ({ children })=>{
|
|
|
73
81
|
const { onCloseModal } = useFormModalNavigation();
|
|
74
82
|
const [isSaving, setIsSaving] = React.useState(false);
|
|
75
83
|
const previousLocationRef = React.useRef(null);
|
|
84
|
+
const renameMigrationModeRef = React.useRef('prompt-before-save');
|
|
85
|
+
// When `modal` mode prompts the user, we hold the pending renames plus the
|
|
86
|
+
// promise resolver here so `saveSchema` can await the decision.
|
|
87
|
+
const [renameModal, setRenameModal] = React.useState(null);
|
|
76
88
|
const isModified = React.useMemo(()=>{
|
|
77
89
|
return !(isEqual(components, initialComponents) && isEqual(contentTypes, initialContentTypes) && isEqual(contentStructure, initialContentStructure));
|
|
78
90
|
}, [
|
|
@@ -92,7 +104,10 @@ const DataManagerProvider = ({ children })=>{
|
|
|
92
104
|
fetchClient.get(`/content-type-builder/schema`),
|
|
93
105
|
fetchClient.get(`/content-type-builder/reserved-names`)
|
|
94
106
|
]);
|
|
95
|
-
const { components, contentTypes, contentStructure } = schemaResponse.data.data;
|
|
107
|
+
const { components, contentTypes, contentStructure, settings } = schemaResponse.data.data;
|
|
108
|
+
if (settings?.renameMigrations?.attributes) {
|
|
109
|
+
renameMigrationModeRef.current = settings.renameMigrations.attributes;
|
|
110
|
+
}
|
|
96
111
|
dispatch(actions.init({
|
|
97
112
|
components: mapValues(components, (component)=>({
|
|
98
113
|
...component,
|
|
@@ -171,6 +186,16 @@ const DataManagerProvider = ({ children })=>{
|
|
|
171
186
|
const updatePermissions = async ()=>{
|
|
172
187
|
await refetchPermissions();
|
|
173
188
|
};
|
|
189
|
+
const requestRenameDecision = async (renames)=>{
|
|
190
|
+
const acceptedKeys = await new Promise((resolve)=>{
|
|
191
|
+
setRenameModal({
|
|
192
|
+
renames,
|
|
193
|
+
resolve
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
setRenameModal(null);
|
|
197
|
+
return acceptedKeys;
|
|
198
|
+
};
|
|
174
199
|
const saveSchema = async ()=>{
|
|
175
200
|
setIsSaving(true);
|
|
176
201
|
const PluginForms = plugin?.apis?.forms;
|
|
@@ -184,6 +209,18 @@ const DataManagerProvider = ({ children })=>{
|
|
|
184
209
|
contentStructure: state.current.contentStructure,
|
|
185
210
|
initialContentStructure: state.current.initialContentStructure
|
|
186
211
|
});
|
|
212
|
+
if (shouldPromptForRenamesBeforeSave(renameMigrationModeRef.current)) {
|
|
213
|
+
const pendingRenames = collectPendingRenames(requestData);
|
|
214
|
+
if (pendingRenames.length > 0) {
|
|
215
|
+
const acceptedKeys = await requestRenameDecision(pendingRenames);
|
|
216
|
+
// The user cancelled the whole save — return to editing untouched.
|
|
217
|
+
if (acceptedKeys === null) {
|
|
218
|
+
setIsSaving(false);
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
applyRenameDecisions(requestData, acceptedKeys);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
187
224
|
// Track that the save button was clicked (includes session ID via useCTBTracking)
|
|
188
225
|
trackUsage('willUpdateCTBSchema', {
|
|
189
226
|
...trackingEventProperties,
|
|
@@ -289,6 +326,7 @@ const DataManagerProvider = ({ children })=>{
|
|
|
289
326
|
componentsGroupedByCategory,
|
|
290
327
|
sortedContentTypesList,
|
|
291
328
|
isLoading,
|
|
329
|
+
attributeRenameMigrationMode: renameMigrationModeRef.current,
|
|
292
330
|
addAttribute (payload) {
|
|
293
331
|
dispatch(actions.addAttribute({
|
|
294
332
|
...payload,
|
|
@@ -313,6 +351,49 @@ const DataManagerProvider = ({ children })=>{
|
|
|
313
351
|
attributeToSet: payload.attributeToSet
|
|
314
352
|
}));
|
|
315
353
|
},
|
|
354
|
+
async confirmAttributeRenameMigration ({ forTarget, uid, oldName, newName }) {
|
|
355
|
+
if (oldName === newName) {
|
|
356
|
+
return true;
|
|
357
|
+
}
|
|
358
|
+
const schema = forTarget === 'contentType' ? contentTypes[uid] : components[uid];
|
|
359
|
+
// A field that was never saved has no data to preserve: accept without
|
|
360
|
+
// prompting so neither name ends up in `declinedRenameNames`.
|
|
361
|
+
const initialAttribute = schema?.attributes.find((attribute)=>attribute.name === oldName);
|
|
362
|
+
if (initialAttribute?.status === 'NEW') {
|
|
363
|
+
return true;
|
|
364
|
+
}
|
|
365
|
+
// Consent inherits along a chain: a hop joining an accepted chain is
|
|
366
|
+
// accepted, one touching a declined name is declined, neither prompts.
|
|
367
|
+
const consent = resolveAfterEditRenameConsent({
|
|
368
|
+
renames: schema?.renames ?? [],
|
|
369
|
+
declinedRenameNames: schema?.declinedRenameNames ?? [],
|
|
370
|
+
oldName,
|
|
371
|
+
newName,
|
|
372
|
+
mode: renameMigrationModeRef.current
|
|
373
|
+
});
|
|
374
|
+
if (consent !== 'prompt') {
|
|
375
|
+
return consent === 'accept';
|
|
376
|
+
}
|
|
377
|
+
const key = `${uid}:edit`;
|
|
378
|
+
const acceptedKeys = await requestRenameDecision([
|
|
379
|
+
{
|
|
380
|
+
key,
|
|
381
|
+
uid,
|
|
382
|
+
typeName: schema?.info.displayName ?? uid,
|
|
383
|
+
pairs: [
|
|
384
|
+
{
|
|
385
|
+
oldName,
|
|
386
|
+
newName
|
|
387
|
+
}
|
|
388
|
+
],
|
|
389
|
+
via: []
|
|
390
|
+
}
|
|
391
|
+
]);
|
|
392
|
+
if (acceptedKeys === null) {
|
|
393
|
+
return null;
|
|
394
|
+
}
|
|
395
|
+
return acceptedKeys.has(key);
|
|
396
|
+
},
|
|
316
397
|
addCreatedComponentToDynamicZone (payload) {
|
|
317
398
|
dispatch(actions.addCreatedComponentToDynamicZone(payload));
|
|
318
399
|
},
|
|
@@ -418,8 +499,78 @@ const DataManagerProvider = ({ children })=>{
|
|
|
418
499
|
moveAttribute (args) {
|
|
419
500
|
dispatch(actions.moveAttribute(args));
|
|
420
501
|
},
|
|
421
|
-
applyChange (
|
|
422
|
-
|
|
502
|
+
async applyChange ({ action, schema }) {
|
|
503
|
+
const renames = schema.renames ?? [];
|
|
504
|
+
if (action !== 'update' || renames.length === 0) {
|
|
505
|
+
dispatch(actions.applyChange({
|
|
506
|
+
action,
|
|
507
|
+
schema
|
|
508
|
+
}));
|
|
509
|
+
return true;
|
|
510
|
+
}
|
|
511
|
+
const mode = renameMigrationModeRef.current;
|
|
512
|
+
if (mode === 'never') {
|
|
513
|
+
dispatch(actions.applyChange({
|
|
514
|
+
action,
|
|
515
|
+
schema: omit(schema, [
|
|
516
|
+
'renames'
|
|
517
|
+
])
|
|
518
|
+
}));
|
|
519
|
+
return true;
|
|
520
|
+
}
|
|
521
|
+
// 'always' | 'prompt-before-save': the before-save modal decides per chain.
|
|
522
|
+
if (mode !== 'prompt-after-edit') {
|
|
523
|
+
dispatch(actions.applyChange({
|
|
524
|
+
action,
|
|
525
|
+
schema
|
|
526
|
+
}));
|
|
527
|
+
return true;
|
|
528
|
+
}
|
|
529
|
+
// 'prompt-after-edit': decide per chain now, inheriting consent already
|
|
530
|
+
// given (or refused) for the hops recorded on the type.
|
|
531
|
+
const existing = schema.modelType === 'contentType' ? contentTypes[schema.uid] : components[schema.uid];
|
|
532
|
+
const chains = groupRenameChains(schema.uid, renames);
|
|
533
|
+
const { keep, prompt } = splitChainsByInheritedConsent({
|
|
534
|
+
recorded: existing?.renames ?? [],
|
|
535
|
+
declinedRenameNames: existing?.declinedRenameNames ?? [],
|
|
536
|
+
chains,
|
|
537
|
+
renames
|
|
538
|
+
});
|
|
539
|
+
const accepted = new Set(keep.map((chain)=>chain.id));
|
|
540
|
+
if (prompt.length > 0) {
|
|
541
|
+
const typeName = schema.info?.displayName ?? schema.uid;
|
|
542
|
+
const decision = await requestRenameDecision(prompt.map((chain)=>toPendingRename(chain, renames, {
|
|
543
|
+
uid: schema.uid,
|
|
544
|
+
typeName
|
|
545
|
+
})));
|
|
546
|
+
// The user cancelled: apply nothing.
|
|
547
|
+
if (decision === null) {
|
|
548
|
+
return false;
|
|
549
|
+
}
|
|
550
|
+
decision.forEach((id)=>accepted.add(id));
|
|
551
|
+
}
|
|
552
|
+
const declinedChains = chains.filter((chain)=>!accepted.has(chain.id));
|
|
553
|
+
const keptRenames = filterRenamesByAcceptedChains(schema.uid, renames, accepted);
|
|
554
|
+
const declinedRenameNames = uniq([
|
|
555
|
+
...schema.declinedRenameNames ?? [],
|
|
556
|
+
...namesOfChains(declinedChains, renames)
|
|
557
|
+
]);
|
|
558
|
+
dispatch(actions.applyChange({
|
|
559
|
+
action,
|
|
560
|
+
schema: {
|
|
561
|
+
...omit(schema, [
|
|
562
|
+
'renames',
|
|
563
|
+
'declinedRenameNames'
|
|
564
|
+
]),
|
|
565
|
+
...keptRenames.length > 0 ? {
|
|
566
|
+
renames: keptRenames
|
|
567
|
+
} : {},
|
|
568
|
+
...declinedRenameNames.length > 0 ? {
|
|
569
|
+
declinedRenameNames
|
|
570
|
+
} : {}
|
|
571
|
+
}
|
|
572
|
+
}));
|
|
573
|
+
return true;
|
|
423
574
|
},
|
|
424
575
|
history: {
|
|
425
576
|
undo () {
|
|
@@ -436,9 +587,16 @@ const DataManagerProvider = ({ children })=>{
|
|
|
436
587
|
canDiscardAll: isModified
|
|
437
588
|
}
|
|
438
589
|
};
|
|
439
|
-
return /*#__PURE__*/
|
|
590
|
+
return /*#__PURE__*/ jsxs(DataManagerContext.Provider, {
|
|
440
591
|
value: context,
|
|
441
|
-
children:
|
|
592
|
+
children: [
|
|
593
|
+
children,
|
|
594
|
+
renameModal && /*#__PURE__*/ jsx(RenameMigrationModal, {
|
|
595
|
+
renames: renameModal.renames,
|
|
596
|
+
onConfirm: (acceptedKeys)=>renameModal.resolve(acceptedKeys),
|
|
597
|
+
onCancel: ()=>renameModal.resolve(null)
|
|
598
|
+
})
|
|
599
|
+
]
|
|
442
600
|
});
|
|
443
601
|
};
|
|
444
602
|
|