@strapi/content-type-builder 5.57.0 → 5.59.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/FeedbackModal.js +13 -7
- package/dist/admin/components/AIChat/FeedbackModal.js.map +1 -1
- package/dist/admin/components/AIChat/FeedbackModal.mjs +14 -8
- package/dist/admin/components/AIChat/FeedbackModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadCodeModal.js +12 -6
- package/dist/admin/components/AIChat/UploadCodeModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadCodeModal.mjs +13 -7
- package/dist/admin/components/AIChat/UploadCodeModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.js +12 -6
- package/dist/admin/components/AIChat/UploadFigmaModal.js.map +1 -1
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs +13 -7
- package/dist/admin/components/AIChat/UploadFigmaModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js +6 -3
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.js.map +1 -1
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs +7 -4
- package/dist/admin/components/AIChat/components/Attachments/components/Attachment.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.js +9 -4
- package/dist/admin/components/AIChat/components/Collapsible.js.map +1 -1
- package/dist/admin/components/AIChat/components/Collapsible.mjs +10 -5
- package/dist/admin/components/AIChat/components/Collapsible.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Dropzone.js +13 -6
- package/dist/admin/components/AIChat/components/Dropzone.js.map +1 -1
- package/dist/admin/components/AIChat/components/Dropzone.mjs +14 -7
- package/dist/admin/components/AIChat/components/Dropzone.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/FloatingPanel.js +11 -4
- package/dist/admin/components/AIChat/components/FloatingPanel.js.map +1 -1
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs +12 -5
- package/dist/admin/components/AIChat/components/FloatingPanel.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.js +16 -8
- package/dist/admin/components/AIChat/components/FullScreenImage.js.map +1 -1
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs +17 -9
- package/dist/admin/components/AIChat/components/FullScreenImage.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Input.js +6 -3
- package/dist/admin/components/AIChat/components/Input.js.map +1 -1
- package/dist/admin/components/AIChat/components/Input.mjs +7 -4
- package/dist/admin/components/AIChat/components/Input.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.js +88 -12
- package/dist/admin/components/AIChat/components/Messages/Message.js.map +1 -1
- package/dist/admin/components/AIChat/components/Messages/Message.mjs +87 -13
- package/dist/admin/components/AIChat/components/Messages/Message.mjs.map +1 -1
- package/dist/admin/components/AIChat/components/StepModal.js +44 -17
- package/dist/admin/components/AIChat/components/StepModal.js.map +1 -1
- package/dist/admin/components/AIChat/components/StepModal.mjs +45 -18
- package/dist/admin/components/AIChat/components/StepModal.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.js +79 -27
- package/dist/admin/components/AIChat/providers/ChatProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs +80 -28
- package/dist/admin/components/AIChat/providers/ChatProvider.mjs.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.js +6 -3
- package/dist/admin/components/AIChat/providers/SchemaProvider.js.map +1 -1
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs +7 -4
- package/dist/admin/components/AIChat/providers/SchemaProvider.mjs.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.js +2 -2
- package/dist/admin/components/AttributeOptions/AttributeOption.js.map +1 -1
- package/dist/admin/components/AttributeOptions/AttributeOption.mjs +2 -2
- package/dist/admin/components/AttributeOptions/AttributeOption.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/buildFolderTree.mjs.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.js.map +1 -1
- package/dist/admin/components/ContentTypeBuilderNav/lib/dropProjection.mjs.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js +2 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.js.map +1 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs +2 -1
- package/dist/admin/components/CustomRadioGroup/CustomRadioGroup.mjs.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.js +317 -275
- package/dist/admin/components/DataManager/DataManagerProvider.js.map +1 -1
- package/dist/admin/components/DataManager/DataManagerProvider.mjs +319 -277
- package/dist/admin/components/DataManager/DataManagerProvider.mjs.map +1 -1
- package/dist/admin/components/DataManager/RenameMigrationModal.js.map +1 -1
- package/dist/admin/components/DataManager/RenameMigrationModal.mjs.map +1 -1
- package/dist/admin/components/DataManager/reducer.js +53 -4
- package/dist/admin/components/DataManager/reducer.js.map +1 -1
- package/dist/admin/components/DataManager/reducer.mjs +53 -4
- package/dist/admin/components/DataManager/reducer.mjs.map +1 -1
- package/dist/admin/components/DynamicZoneList.js +2 -1
- package/dist/admin/components/DynamicZoneList.js.map +1 -1
- package/dist/admin/components/DynamicZoneList.mjs +2 -1
- package/dist/admin/components/DynamicZoneList.mjs.map +1 -1
- package/dist/admin/components/FormModal/FormModal.js +36 -62
- package/dist/admin/components/FormModal/FormModal.js.map +1 -1
- package/dist/admin/components/FormModal/FormModal.mjs +36 -62
- package/dist/admin/components/FormModal/FormModal.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js +2 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs +2 -1
- package/dist/admin/components/FormModal/attributes/ConditionForm.mjs.map +1 -1
- package/dist/admin/components/FormModal/attributes/types.js +2 -2
- package/dist/admin/components/FormModal/attributes/types.js.map +1 -1
- package/dist/admin/components/FormModal/attributes/types.mjs +2 -2
- package/dist/admin/components/FormModal/attributes/types.mjs.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.js +1 -1
- package/dist/admin/components/FormModal/forms/forms.js.map +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs +1 -1
- package/dist/admin/components/FormModal/forms/forms.mjs.map +1 -1
- package/dist/admin/components/GenericInputs.js +2 -1
- package/dist/admin/components/GenericInputs.js.map +1 -1
- package/dist/admin/components/GenericInputs.mjs +2 -1
- package/dist/admin/components/GenericInputs.mjs.map +1 -1
- package/dist/admin/components/TabForm.js.map +1 -1
- package/dist/admin/components/TabForm.mjs.map +1 -1
- package/dist/admin/src/components/AIChat/components/FullScreenImage.d.ts +8 -0
- package/dist/admin/src/components/AIChat/components/Messages/Message.d.ts +20 -0
- package/dist/admin/src/components/DataManager/utils/cleanData.d.ts +8 -8
- package/dist/admin/translations/cs.json.js +0 -2
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +0 -2
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +0 -2
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +0 -2
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +0 -2
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +0 -2
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/ja.json.js +0 -2
- package/dist/admin/translations/ja.json.js.map +1 -1
- package/dist/admin/translations/ja.json.mjs +0 -2
- package/dist/admin/translations/ja.json.mjs.map +1 -1
- package/dist/admin/translations/ko.json.js +0 -2
- package/dist/admin/translations/ko.json.js.map +1 -1
- package/dist/admin/translations/ko.json.mjs +0 -2
- package/dist/admin/translations/ko.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +0 -2
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +0 -2
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +0 -2
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +0 -2
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +0 -2
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +0 -2
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/sk.json.js +0 -2
- package/dist/admin/translations/sk.json.js.map +1 -1
- package/dist/admin/translations/sk.json.mjs +0 -2
- package/dist/admin/translations/sk.json.mjs.map +1 -1
- package/dist/admin/utils/folderTelemetry.js.map +1 -1
- package/dist/admin/utils/folderTelemetry.mjs.map +1 -1
- package/dist/admin/utils/formAPI.js.map +1 -1
- package/dist/admin/utils/formAPI.mjs.map +1 -1
- package/dist/server/controllers/validation/schema.js +3 -2
- package/dist/server/controllers/validation/schema.js.map +1 -1
- package/dist/server/controllers/validation/schema.mjs +4 -3
- package/dist/server/controllers/validation/schema.mjs.map +1 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/migration-builder/index.js.map +1 -1
- package/dist/server/services/migration-builder/index.mjs.map +1 -1
- package/dist/server/services/schema.js +87 -1
- package/dist/server/services/schema.js.map +1 -1
- package/dist/server/services/schema.mjs +87 -1
- package/dist/server/services/schema.mjs.map +1 -1
- package/dist/server/src/controllers/validation/schema.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/migration-builder/index.d.ts.map +1 -1
- package/dist/server/src/services/schema-builder/types.d.ts.map +1 -1
- package/dist/server/src/services/schema.d.ts.map +1 -1
- package/dist/server/src/utils/uid-target.d.ts +18 -0
- package/dist/server/src/utils/uid-target.d.ts.map +1 -0
- package/dist/server/utils/uid-target.js +34 -0
- package/dist/server/utils/uid-target.js.map +1 -0
- package/dist/server/utils/uid-target.mjs +31 -0
- package/dist/server/utils/uid-target.mjs.map +1 -0
- package/package.json +6 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DataManagerProvider.mjs","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
|
+
{"version":3,"file":"DataManagerProvider.mjs","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 = React.useCallback(async () => {\n await refetchPermissions();\n }, [refetchPermissions]);\n\n const requestRenameDecision = React.useCallback(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 = React.useCallback(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 ctbSessionId,\n dispatch,\n dispatchGuidedTour,\n fetchClient,\n formatMessage,\n initialContentTypes,\n lockAppWithAutoreload,\n plugin,\n regenerateSessionId,\n requestRenameDecision,\n serverRestartWatcher,\n state,\n toggleNotification,\n trackUsage,\n unlockAppWithAutoreload,\n updatePermissions,\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 = React.useMemo<DataManagerContextValue>(\n () => ({\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 allComponentsCategories,\n components,\n componentsGroupedByCategory,\n componentsThatHaveOtherComponentInTheirAttributes,\n contentStructure,\n contentTypes,\n dispatch,\n formatMessage,\n initialComponents,\n initialContentTypes,\n isInDevelopmentMode,\n isLoading,\n isModified,\n isSaving,\n nestedComponents,\n onCloseModal,\n requestRenameDecision,\n reservedNames,\n saveSchema,\n sortedContentTypesList,\n state,\n trackUsage,\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","useCallback","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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenameMigrationModal.js","sources":["../../../../admin/src/components/DataManager/RenameMigrationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Checkbox, Flex, Modal, Typography } from '@strapi/design-system';\nimport { ArrowRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\n\nimport { groupRenameChains, type RenameChain, type RenamePair } from './utils/groupRenameChains';\n\nimport type { RenameHop } from '../../types';\n\nexport type AttributeRenameMigrationMode =\n | 'always'\n | 'never'\n | 'prompt-after-edit'\n | 'prompt-before-save';\n\nexport type AttributeRenameDecision = boolean | 'prompt';\n\nexport const getAttributeRenameDecision = (\n mode: AttributeRenameMigrationMode\n): AttributeRenameDecision => {\n if (mode === 'never') {\n return false;\n }\n\n if (mode === 'prompt-after-edit') {\n return 'prompt';\n }\n\n return true;\n};\n\nexport const shouldPromptForRenamesBeforeSave = (mode: AttributeRenameMigrationMode): boolean =>\n mode === 'prompt-before-save';\n\n/**\n * One rename *chain* on an existing type, shown as a single row in the\n * confirmation modal. Consent is given per chain, never per hop: replaying a\n * partial chain either fails or silently skips hops whose target column still\n * exists. `key` is the chain id (`${uid}:chain:${firstHopIndex}`) so a decision\n * maps back to every hop of that chain in the type's ordered `renames` array.\n */\nexport interface PendingRename {\n key: string;\n uid: string;\n typeName: string;\n /** Net effect of the chain (`old -> new`); the raw hops for a pure swap-back. */\n pairs: RenamePair[];\n /** Intermediate names the chain routes through (e.g. `tmp`). */\n via: string[];\n /** True when the chain's net effect is empty (fields swapped back) but data still moves. */\n isSwapBack?: boolean;\n}\n\ninterface RenameMigrationModalProps {\n renames: PendingRename[];\n /**\n * Resolves with the keys of the hops the user chose to preserve (every row\n * is checked by default), or an empty set for \"don't preserve data\".\n */\n onConfirm: (acceptedKeys: Set<string>) => void;\n /** Aborts the current edit or save and returns to editing. */\n onCancel: () => void;\n}\n\nconst RenameMigrationModal = ({ renames, onConfirm, onCancel }: RenameMigrationModalProps) => {\n const { formatMessage } = useIntl();\n const descriptionId = React.useId();\n\n const [checkedKeys, setCheckedKeys] = React.useState<Set<string>>(\n () => new Set(renames.map((rename) => rename.key))\n );\n\n const chainNames = (rename: PendingRename) => rename.pairs.map((pair) => pair.oldName).join(', ');\n\n const toggle = (key: string, checked: boolean) => {\n setCheckedKeys((previous) => {\n const next = new Set(previous);\n if (checked) {\n next.add(key);\n } else {\n next.delete(key);\n }\n return next;\n });\n };\n\n return (\n <Modal.Root open onOpenChange={(open) => !open && onCancel()}>\n <Modal.Content aria-describedby={descriptionId}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('migration.confirmation.title'),\n defaultMessage: 'Preserve data for renamed fields?',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography id={descriptionId} variant=\"omega\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.description'),\n defaultMessage:\n 'You renamed the fields below. Strapi can generate a migration to preserve existing data by renaming the underlying database columns. Untick a rename to let those fields start empty instead.',\n })}\n </Typography>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {renames.map((rename) => (\n <Flex\n key={rename.key}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n hasRadius\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n {rename.pairs.map((pair) => (\n <Flex key={`${pair.oldName}->${pair.newName}`} gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.oldName}\n </Typography>\n <ArrowRight width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.newName}\n </Typography>\n </Flex>\n ))}\n {rename.isSwapBack && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.field.swap'),\n defaultMessage:\n 'Fields swapped back to their original names; data still moves.',\n })}\n </Typography>\n )}\n {rename.via.length > 0 && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.via'),\n defaultMessage: 'via {names}',\n },\n { names: rename.via.join(', ') }\n )}\n </Typography>\n )}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.in'),\n defaultMessage: 'in {typeName}',\n },\n { typeName: rename.typeName }\n )}\n </Typography>\n </Flex>\n <Checkbox\n aria-label={formatMessage(\n {\n id: getTrad('migration.confirmation.field.preserve'),\n defaultMessage: 'Preserve data of {names} in {typeName}',\n },\n { names: chainNames(rename), typeName: rename.typeName }\n )}\n checked={checkedKeys.has(rename.key)}\n onCheckedChange={(checked) => toggle(rename.key, checked === true)}\n />\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={onCancel}>\n {formatMessage({\n id: getTrad('migration.confirmation.cancel'),\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Modal.Close>\n <Button variant=\"danger-light\" onClick={() => onConfirm(new Set())}>\n {formatMessage({\n id: getTrad('migration.confirmation.decline'),\n defaultMessage: \"Don't preserve data\",\n })}\n </Button>\n <Button disabled={checkedKeys.size === 0} onClick={() => onConfirm(checkedKeys)}>\n {formatMessage({\n id: getTrad('migration.confirmation.confirm'),\n defaultMessage: 'Preserve data',\n })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nexport { RenameMigrationModal };\n\nconst getTypeName = (entry: { displayName?: string; uid: string }): string =>\n entry.displayName ?? entry.uid;\n\ntype RenameAwareEntry = {\n action?: string;\n uid: string;\n displayName?: string;\n renames?: RenameHop[];\n};\n\n/**\n * Builds the modal row for one chain. A chain whose net effect is empty (the\n * user renamed fields back to their original names through a swap) still has\n * to run every hop, so its raw hops are shown instead of an empty row.\n */\nexport const toPendingRename = (\n chain: RenameChain,\n renames: RenameHop[],\n { uid, typeName }: { uid: string; typeName: string }\n): PendingRename => {\n const isSwapBack = chain.pairs.length === 0;\n\n return {\n key: chain.id,\n uid,\n typeName,\n pairs: isSwapBack ? chain.hopIndexes.map((index) => renames[index]) : chain.pairs,\n via: chain.via,\n ...(isSwapBack ? { isSwapBack: true } : {}),\n };\n};\n\n/**\n * Groups the ordered per-type `renames` arrays in a request payload into\n * chains for display, one `PendingRename` per chain, preserving order.\n */\nexport const collectPendingRenames = (requestData: {\n contentTypes: RenameAwareEntry[];\n components: RenameAwareEntry[];\n}): PendingRename[] => {\n const items: PendingRename[] = [];\n\n const visit = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const { renames } = entry;\n groupRenameChains(entry.uid, renames).forEach((chain) => {\n items.push(\n toPendingRename(chain, renames, { uid: entry.uid, typeName: getTypeName(entry) })\n );\n });\n }\n });\n };\n\n visit(requestData.contentTypes ?? []);\n visit(requestData.components ?? []);\n\n return items;\n};\n\n/**\n * Keeps only the hops of `renames` that belong to an accepted chain. Filtering\n * by index preserves the original order, and a chain is always kept or dropped\n * as a whole, so the result can never be a truncated chain.\n */\nexport const filterRenamesByAcceptedChains = (\n uid: string,\n renames: RenameHop[],\n acceptedChainIds: Set<string>\n): RenameHop[] => {\n const keptIndexes = new Set<number>();\n groupRenameChains(uid, renames).forEach((chain) => {\n if (acceptedChainIds.has(chain.id)) {\n chain.hopIndexes.forEach((index) => keptIndexes.add(index));\n }\n });\n\n return renames.filter((_, index) => keptIndexes.has(index));\n};\n\n/**\n * Mutates the request payload so each type keeps only the rename chains the\n * user accepted; types left with no accepted hops drop their `renames` entirely.\n */\nexport const applyRenameDecisions = (\n requestData: { contentTypes: RenameAwareEntry[]; components: RenameAwareEntry[] },\n acceptedKeys: Set<string>\n): void => {\n const apply = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const kept = filterRenamesByAcceptedChains(entry.uid, entry.renames, acceptedKeys);\n if (kept.length > 0) {\n entry.renames = kept;\n } else {\n delete entry.renames;\n }\n }\n });\n };\n\n apply(requestData.contentTypes ?? []);\n apply(requestData.components ?? []);\n};\n"],"names":["getAttributeRenameDecision","mode","shouldPromptForRenamesBeforeSave","RenameMigrationModal","renames","onConfirm","onCancel","formatMessage","useIntl","descriptionId","React","useId","checkedKeys","setCheckedKeys","useState","Set","map","rename","key","chainNames","pairs","pair","oldName","join","toggle","checked","previous","next","add","delete","_jsx","Modal","Root","open","onOpenChange","_jsxs","Content","aria-describedby","Header","Title","id","getTrad","defaultMessage","Body","Flex","direction","alignItems","gap","Typography","variant","textColor","justifyContent","hasRadius","borderColor","padding","fontWeight","ArrowRight","width","height","fill","newName","isSwapBack","via","length","names","typeName","Checkbox","aria-label","has","onCheckedChange","Footer","Close","Button","onClick","disabled","size","getTypeName","entry","displayName","uid","toPendingRename","chain","hopIndexes","index","collectPendingRenames","requestData","items","visit","entries","forEach","action","Array","isArray","groupRenameChains","push","contentTypes","components","filterRenamesByAcceptedChains","acceptedChainIds","keptIndexes","filter","_","applyRenameDecisions","acceptedKeys","apply","kept"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBO,MAAMA,6BAA6B,CACxCC,IAAAA,GAAAA;AAEA,IAAA,IAAIA,SAAS,OAAA,EAAS;QACpB,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIA,SAAS,mBAAA,EAAqB;QAChC,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEO,MAAMC,gCAAAA,GAAmC,CAACD,IAAAA,GAC/CA,SAAS;AAgCX,MAAME,oBAAAA,GAAuB,CAAC,EAAEC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,EAA6B,GAAA;IACvF,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAMC,aAAAA,GAAgBC,iBAAMC,KAAK,EAAA;AAEjC,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAAA,CAAe,GAAGH,gBAAAA,CAAMI,QAAQ,CAClD,IAAM,IAAIC,GAAAA,CAAIX,QAAQY,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG,CAAA,CAAA,CAAA;AAGlD,IAAA,MAAMC,UAAAA,GAAa,CAACF,MAAAA,GAA0BA,MAAAA,CAAOG,KAAK,CAACJ,GAAG,CAAC,CAACK,IAAAA,GAASA,IAAAA,CAAKC,OAAO,CAAA,CAAEC,IAAI,CAAC,IAAA,CAAA;IAE5F,MAAMC,MAAAA,GAAS,CAACN,GAAAA,EAAaO,OAAAA,GAAAA;AAC3BZ,QAAAA,cAAAA,CAAe,CAACa,QAAAA,GAAAA;YACd,MAAMC,IAAAA,GAAO,IAAIZ,GAAAA,CAAIW,QAAAA,CAAAA;AACrB,YAAA,IAAID,OAAAA,EAAS;AACXE,gBAAAA,IAAAA,CAAKC,GAAG,CAACV,GAAAA,CAAAA;YACX,CAAA,MAAO;AACLS,gBAAAA,IAAAA,CAAKE,MAAM,CAACX,GAAAA,CAAAA;AACd,YAAA;YACA,OAAOS,IAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEA,qBACEG,cAAA,CAACC,mBAAMC,IAAI,EAAA;QAACC,IAAI,EAAA,IAAA;QAACC,YAAAA,EAAc,CAACD,IAAAA,GAAS,CAACA,IAAAA,IAAQ3B,QAAAA,EAAAA;gCAChD6B,eAAA,CAACJ,mBAAMK,OAAO,EAAA;YAACC,kBAAAA,EAAkB5B,aAAAA;;AAC/B,8BAAAqB,cAAA,CAACC,mBAAMO,MAAM,EAAA;4CACXR,cAAA,CAACC,mBAAMQ,KAAK,EAAA;kCACThC,aAAAA,CAAc;AACbiC,4BAAAA,EAAAA,EAAIC,eAAAA,CAAQ,8BAAA,CAAA;4BACZC,cAAAA,EAAgB;AAClB,yBAAA;;;AAGJ,8BAAAZ,cAAA,CAACC,mBAAMY,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAAR,eAAA,CAACS,iBAAAA,EAAAA;wBAAKC,SAAAA,EAAU,QAAA;wBAASC,UAAAA,EAAW,SAAA;wBAAUC,GAAAA,EAAK,CAAA;;0CACjDjB,cAAA,CAACkB,uBAAAA,EAAAA;gCAAWR,EAAAA,EAAI/B,aAAAA;gCAAewC,OAAAA,EAAQ,OAAA;gCAAQC,SAAAA,EAAU,YAAA;0CACtD3C,aAAAA,CAAc;AACbiC,oCAAAA,EAAAA,EAAIC,eAAAA,CAAQ,oCAAA,CAAA;oCACZC,cAAAA,EACE;AACJ,iCAAA;;0CAEFZ,cAAA,CAACc,iBAAAA,EAAAA;gCAAKC,SAAAA,EAAU,QAAA;gCAASC,UAAAA,EAAW,SAAA;gCAAUC,GAAAA,EAAK,CAAA;AAChD3C,gCAAAA,QAAAA,EAAAA,OAAAA,CAAQY,GAAG,CAAC,CAACC,MAAAA,iBACZkB,eAAA,CAACS,iBAAAA,EAAAA;wCAECO,cAAAA,EAAe,eAAA;wCACfL,UAAAA,EAAW,QAAA;wCACXM,SAAS,EAAA,IAAA;wCACTC,WAAAA,EAAY,YAAA;wCACZC,OAAAA,EAAS,CAAA;wCACTP,GAAAA,EAAK,CAAA;;0DAELZ,eAAA,CAACS,iBAAAA,EAAAA;gDAAKC,SAAAA,EAAU,QAAA;gDAASC,UAAAA,EAAW,OAAA;gDAAQC,GAAAA,EAAK,CAAA;;AAC9C9B,oDAAAA,MAAAA,CAAOG,KAAK,CAACJ,GAAG,CAAC,CAACK,qBACjBc,eAAA,CAACS,iBAAAA,EAAAA;4DAA8CG,GAAAA,EAAK,CAAA;4DAAGD,UAAAA,EAAW,QAAA;;8EAChEhB,cAAA,CAACkB,uBAAAA,EAAAA;oEAAWC,OAAAA,EAAQ,OAAA;oEAAQM,UAAAA,EAAW,MAAA;AACpClC,oEAAAA,QAAAA,EAAAA,IAAAA,CAAKC;;8EAERQ,cAAA,CAAC0B,gBAAAA,EAAAA;oEAAWC,KAAAA,EAAM,QAAA;oEAASC,MAAAA,EAAO,QAAA;oEAASC,IAAAA,EAAK;;8EAChD7B,cAAA,CAACkB,uBAAAA,EAAAA;oEAAWC,OAAAA,EAAQ,OAAA;oEAAQM,UAAAA,EAAW,MAAA;AACpClC,oEAAAA,QAAAA,EAAAA,IAAAA,CAAKuC;;;AANC,yDAAA,EAAA,CAAA,EAAGvC,KAAKC,OAAO,CAAC,EAAE,EAAED,IAAAA,CAAKuC,OAAO,CAAA,CAAE,CAAA,CAAA;oDAU9C3C,MAAAA,CAAO4C,UAAU,kBAChB/B,cAAA,CAACkB,uBAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CAAc;AACbiC,4DAAAA,EAAAA,EAAIC,eAAAA,CAAQ,mCAAA,CAAA;4DACZC,cAAAA,EACE;AACJ,yDAAA;;AAGHzB,oDAAAA,MAAAA,CAAO6C,GAAG,CAACC,MAAM,GAAG,mBACnBjC,cAAA,CAACkB,uBAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CACC;AACEiC,4DAAAA,EAAAA,EAAIC,eAAAA,CAAQ,kCAAA,CAAA;4DACZC,cAAAA,EAAgB;yDAClB,EACA;AAAEsB,4DAAAA,KAAAA,EAAO/C,MAAAA,CAAO6C,GAAG,CAACvC,IAAI,CAAC,IAAA;AAAM,yDAAA;;kEAIrCO,cAAA,CAACkB,uBAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CACC;AACEiC,4DAAAA,EAAAA,EAAIC,eAAAA,CAAQ,iCAAA,CAAA;4DACZC,cAAAA,EAAgB;yDAClB,EACA;AAAEuB,4DAAAA,QAAAA,EAAUhD,OAAOgD;AAAS,yDAAA;;;;0DAIlCnC,cAAA,CAACoC,qBAAAA,EAAAA;AACCC,gDAAAA,YAAAA,EAAY5D,aAAAA,CACV;AACEiC,oDAAAA,EAAAA,EAAIC,eAAAA,CAAQ,uCAAA,CAAA;oDACZC,cAAAA,EAAgB;iDAClB,EACA;AAAEsB,oDAAAA,KAAAA,EAAO7C,UAAAA,CAAWF,MAAAA,CAAAA;AAASgD,oDAAAA,QAAAA,EAAUhD,OAAOgD;AAAS,iDAAA,CAAA;AAEzDxC,gDAAAA,OAAAA,EAASb,WAAAA,CAAYwD,GAAG,CAACnD,MAAAA,CAAOC,GAAG,CAAA;AACnCmD,gDAAAA,eAAAA,EAAiB,CAAC5C,OAAAA,GAAYD,MAAAA,CAAOP,MAAAA,CAAOC,GAAG,EAAEO,OAAAA,KAAY,IAAA;;;AA3D1DR,qCAAAA,EAAAA,MAAAA,CAAOC,GAAG,CAAA;;;;;AAkEzB,8BAAAiB,eAAA,CAACJ,mBAAMuC,MAAM,EAAA;;AACX,sCAAAxC,cAAA,CAACC,mBAAMwC,KAAK,EAAA;AACV,4BAAA,QAAA,gBAAAzC,cAAA,CAAC0C,mBAAAA,EAAAA;gCAAOvB,OAAAA,EAAQ,UAAA;gCAAWwB,OAAAA,EAASnE,QAAAA;0CACjCC,aAAAA,CAAc;AACbiC,oCAAAA,EAAAA,EAAIC,eAAAA,CAAQ,+BAAA,CAAA;oCACZC,cAAAA,EAAgB;AAClB,iCAAA;;;sCAGJZ,cAAA,CAAC0C,mBAAAA,EAAAA;4BAAOvB,OAAAA,EAAQ,cAAA;4BAAewB,OAAAA,EAAS,IAAMpE,UAAU,IAAIU,GAAAA,EAAAA,CAAAA;sCACzDR,aAAAA,CAAc;AACbiC,gCAAAA,EAAAA,EAAIC,eAAAA,CAAQ,gCAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA;;sCAEFZ,cAAA,CAAC0C,mBAAAA,EAAAA;4BAAOE,QAAAA,EAAU9D,WAAAA,CAAY+D,IAAI,KAAK,CAAA;AAAGF,4BAAAA,OAAAA,EAAS,IAAMpE,SAAAA,CAAUO,WAAAA,CAAAA;sCAChEL,aAAAA,CAAc;AACbiC,gCAAAA,EAAAA,EAAIC,eAAAA,CAAQ,gCAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA;;;;;;;AAMZ;AAIA,MAAMkC,cAAc,CAACC,KAAAA,GACnBA,MAAMC,WAAW,IAAID,MAAME,GAAG;AAShC;;;;IAKO,MAAMC,eAAAA,GAAkB,CAC7BC,KAAAA,EACA7E,SACA,EAAE2E,GAAG,EAAEd,QAAQ,EAAqC,GAAA;AAEpD,IAAA,MAAMJ,UAAAA,GAAaoB,KAAAA,CAAM7D,KAAK,CAAC2C,MAAM,KAAK,CAAA;IAE1C,OAAO;AACL7C,QAAAA,GAAAA,EAAK+D,MAAMzC,EAAE;AACbuC,QAAAA,GAAAA;AACAd,QAAAA,QAAAA;AACA7C,QAAAA,KAAAA,EAAOyC,UAAAA,GAAaoB,KAAAA,CAAMC,UAAU,CAAClE,GAAG,CAAC,CAACmE,KAAAA,GAAU/E,OAAO,CAAC+E,KAAAA,CAAM,CAAA,GAAIF,MAAM7D,KAAK;AACjF0C,QAAAA,GAAAA,EAAKmB,MAAMnB,GAAG;AACd,QAAA,GAAID,UAAAA,GAAa;YAAEA,UAAAA,EAAY;AAAK,SAAA,GAAI;AAC1C,KAAA;AACF;AAEA;;;IAIO,MAAMuB,qBAAAA,GAAwB,CAACC,WAAAA,GAAAA;AAIpC,IAAA,MAAMC,QAAyB,EAAE;AAEjC,IAAA,MAAMC,QAAQ,CAACC,OAAAA,GAAAA;QACbA,OAAAA,CAAQC,OAAO,CAAC,CAACZ,KAAAA,GAAAA;YACf,IAAIA,KAAAA,CAAMa,MAAM,KAAK,QAAA,IAAYC,MAAMC,OAAO,CAACf,KAAAA,CAAMzE,OAAO,CAAA,EAAG;gBAC7D,MAAM,EAAEA,OAAO,EAAE,GAAGyE,KAAAA;AACpBgB,gBAAAA,mCAAAA,CAAkBhB,MAAME,GAAG,EAAE3E,OAAAA,CAAAA,CAASqF,OAAO,CAAC,CAACR,KAAAA,GAAAA;AAC7CK,oBAAAA,KAAAA,CAAMQ,IAAI,CACRd,eAAAA,CAAgBC,KAAAA,EAAO7E,OAAAA,EAAS;AAAE2E,wBAAAA,GAAAA,EAAKF,MAAME,GAAG;AAAEd,wBAAAA,QAAAA,EAAUW,WAAAA,CAAYC,KAAAA;AAAO,qBAAA,CAAA,CAAA;AAEnF,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEAU,KAAAA,CAAMF,WAAAA,CAAYU,YAAY,IAAI,EAAE,CAAA;IACpCR,KAAAA,CAAMF,WAAAA,CAAYW,UAAU,IAAI,EAAE,CAAA;IAElC,OAAOV,KAAAA;AACT;AAEA;;;;AAIC,IACM,MAAMW,6BAAAA,GAAgC,CAC3ClB,KACA3E,OAAAA,EACA8F,gBAAAA,GAAAA;AAEA,IAAA,MAAMC,cAAc,IAAIpF,GAAAA,EAAAA;AACxB8E,IAAAA,mCAAAA,CAAkBd,GAAAA,EAAK3E,OAAAA,CAAAA,CAASqF,OAAO,CAAC,CAACR,KAAAA,GAAAA;AACvC,QAAA,IAAIiB,gBAAAA,CAAiB9B,GAAG,CAACa,KAAAA,CAAMzC,EAAE,CAAA,EAAG;YAClCyC,KAAAA,CAAMC,UAAU,CAACO,OAAO,CAAC,CAACN,KAAAA,GAAUgB,WAAAA,CAAYvE,GAAG,CAACuD,KAAAA,CAAAA,CAAAA;AACtD,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO/E,OAAAA,CAAQgG,MAAM,CAAC,CAACC,GAAGlB,KAAAA,GAAUgB,WAAAA,CAAY/B,GAAG,CAACe,KAAAA,CAAAA,CAAAA;AACtD;AAEA;;;AAGC,IACM,MAAMmB,oBAAAA,GAAuB,CAClCjB,WAAAA,EACAkB,YAAAA,GAAAA;AAEA,IAAA,MAAMC,QAAQ,CAAChB,OAAAA,GAAAA;QACbA,OAAAA,CAAQC,OAAO,CAAC,CAACZ,KAAAA,GAAAA;YACf,IAAIA,KAAAA,CAAMa,MAAM,KAAK,QAAA,IAAYC,MAAMC,OAAO,CAACf,KAAAA,CAAMzE,OAAO,CAAA,EAAG;AAC7D,gBAAA,MAAMqG,OAAOR,6BAAAA,CAA8BpB,KAAAA,CAAME,GAAG,EAAEF,KAAAA,CAAMzE,OAAO,EAAEmG,YAAAA,CAAAA;gBACrE,IAAIE,IAAAA,CAAK1C,MAAM,GAAG,CAAA,EAAG;AACnBc,oBAAAA,KAAAA,CAAMzE,OAAO,GAAGqG,IAAAA;gBAClB,CAAA,MAAO;AACL,oBAAA,OAAO5B,MAAMzE,OAAO;AACtB,gBAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEAoG,KAAAA,CAAMnB,WAAAA,CAAYU,YAAY,IAAI,EAAE,CAAA;IACpCS,KAAAA,CAAMnB,WAAAA,CAAYW,UAAU,IAAI,EAAE,CAAA;AACpC;;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"RenameMigrationModal.js","sources":["../../../../admin/src/components/DataManager/RenameMigrationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Checkbox, Flex, Modal, Typography } from '@strapi/design-system';\nimport { ArrowRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\n\nimport { groupRenameChains, type RenameChain, type RenamePair } from './utils/groupRenameChains';\n\nimport type { RenameHop } from '../../types';\n\nexport type AttributeRenameMigrationMode =\n 'always' | 'never' | 'prompt-after-edit' | 'prompt-before-save';\n\nexport type AttributeRenameDecision = boolean | 'prompt';\n\nexport const getAttributeRenameDecision = (\n mode: AttributeRenameMigrationMode\n): AttributeRenameDecision => {\n if (mode === 'never') {\n return false;\n }\n\n if (mode === 'prompt-after-edit') {\n return 'prompt';\n }\n\n return true;\n};\n\nexport const shouldPromptForRenamesBeforeSave = (mode: AttributeRenameMigrationMode): boolean =>\n mode === 'prompt-before-save';\n\n/**\n * One rename *chain* on an existing type, shown as a single row in the\n * confirmation modal. Consent is given per chain, never per hop: replaying a\n * partial chain either fails or silently skips hops whose target column still\n * exists. `key` is the chain id (`${uid}:chain:${firstHopIndex}`) so a decision\n * maps back to every hop of that chain in the type's ordered `renames` array.\n */\nexport interface PendingRename {\n key: string;\n uid: string;\n typeName: string;\n /** Net effect of the chain (`old -> new`); the raw hops for a pure swap-back. */\n pairs: RenamePair[];\n /** Intermediate names the chain routes through (e.g. `tmp`). */\n via: string[];\n /** True when the chain's net effect is empty (fields swapped back) but data still moves. */\n isSwapBack?: boolean;\n}\n\ninterface RenameMigrationModalProps {\n renames: PendingRename[];\n /**\n * Resolves with the keys of the hops the user chose to preserve (every row\n * is checked by default), or an empty set for \"don't preserve data\".\n */\n onConfirm: (acceptedKeys: Set<string>) => void;\n /** Aborts the current edit or save and returns to editing. */\n onCancel: () => void;\n}\n\nconst RenameMigrationModal = ({ renames, onConfirm, onCancel }: RenameMigrationModalProps) => {\n const { formatMessage } = useIntl();\n const descriptionId = React.useId();\n\n const [checkedKeys, setCheckedKeys] = React.useState<Set<string>>(\n () => new Set(renames.map((rename) => rename.key))\n );\n\n const chainNames = (rename: PendingRename) => rename.pairs.map((pair) => pair.oldName).join(', ');\n\n const toggle = (key: string, checked: boolean) => {\n setCheckedKeys((previous) => {\n const next = new Set(previous);\n if (checked) {\n next.add(key);\n } else {\n next.delete(key);\n }\n return next;\n });\n };\n\n return (\n <Modal.Root open onOpenChange={(open) => !open && onCancel()}>\n <Modal.Content aria-describedby={descriptionId}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('migration.confirmation.title'),\n defaultMessage: 'Preserve data for renamed fields?',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography id={descriptionId} variant=\"omega\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.description'),\n defaultMessage:\n 'You renamed the fields below. Strapi can generate a migration to preserve existing data by renaming the underlying database columns. Untick a rename to let those fields start empty instead.',\n })}\n </Typography>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {renames.map((rename) => (\n <Flex\n key={rename.key}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n hasRadius\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n {rename.pairs.map((pair) => (\n <Flex key={`${pair.oldName}->${pair.newName}`} gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.oldName}\n </Typography>\n <ArrowRight width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.newName}\n </Typography>\n </Flex>\n ))}\n {rename.isSwapBack && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.field.swap'),\n defaultMessage:\n 'Fields swapped back to their original names; data still moves.',\n })}\n </Typography>\n )}\n {rename.via.length > 0 && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.via'),\n defaultMessage: 'via {names}',\n },\n { names: rename.via.join(', ') }\n )}\n </Typography>\n )}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.in'),\n defaultMessage: 'in {typeName}',\n },\n { typeName: rename.typeName }\n )}\n </Typography>\n </Flex>\n <Checkbox\n aria-label={formatMessage(\n {\n id: getTrad('migration.confirmation.field.preserve'),\n defaultMessage: 'Preserve data of {names} in {typeName}',\n },\n { names: chainNames(rename), typeName: rename.typeName }\n )}\n checked={checkedKeys.has(rename.key)}\n onCheckedChange={(checked) => toggle(rename.key, checked === true)}\n />\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={onCancel}>\n {formatMessage({\n id: getTrad('migration.confirmation.cancel'),\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Modal.Close>\n <Button variant=\"danger-light\" onClick={() => onConfirm(new Set())}>\n {formatMessage({\n id: getTrad('migration.confirmation.decline'),\n defaultMessage: \"Don't preserve data\",\n })}\n </Button>\n <Button disabled={checkedKeys.size === 0} onClick={() => onConfirm(checkedKeys)}>\n {formatMessage({\n id: getTrad('migration.confirmation.confirm'),\n defaultMessage: 'Preserve data',\n })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nexport { RenameMigrationModal };\n\nconst getTypeName = (entry: { displayName?: string; uid: string }): string =>\n entry.displayName ?? entry.uid;\n\ntype RenameAwareEntry = {\n action?: string;\n uid: string;\n displayName?: string;\n renames?: RenameHop[];\n};\n\n/**\n * Builds the modal row for one chain. A chain whose net effect is empty (the\n * user renamed fields back to their original names through a swap) still has\n * to run every hop, so its raw hops are shown instead of an empty row.\n */\nexport const toPendingRename = (\n chain: RenameChain,\n renames: RenameHop[],\n { uid, typeName }: { uid: string; typeName: string }\n): PendingRename => {\n const isSwapBack = chain.pairs.length === 0;\n\n return {\n key: chain.id,\n uid,\n typeName,\n pairs: isSwapBack ? chain.hopIndexes.map((index) => renames[index]) : chain.pairs,\n via: chain.via,\n ...(isSwapBack ? { isSwapBack: true } : {}),\n };\n};\n\n/**\n * Groups the ordered per-type `renames` arrays in a request payload into\n * chains for display, one `PendingRename` per chain, preserving order.\n */\nexport const collectPendingRenames = (requestData: {\n contentTypes: RenameAwareEntry[];\n components: RenameAwareEntry[];\n}): PendingRename[] => {\n const items: PendingRename[] = [];\n\n const visit = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const { renames } = entry;\n groupRenameChains(entry.uid, renames).forEach((chain) => {\n items.push(\n toPendingRename(chain, renames, { uid: entry.uid, typeName: getTypeName(entry) })\n );\n });\n }\n });\n };\n\n visit(requestData.contentTypes ?? []);\n visit(requestData.components ?? []);\n\n return items;\n};\n\n/**\n * Keeps only the hops of `renames` that belong to an accepted chain. Filtering\n * by index preserves the original order, and a chain is always kept or dropped\n * as a whole, so the result can never be a truncated chain.\n */\nexport const filterRenamesByAcceptedChains = (\n uid: string,\n renames: RenameHop[],\n acceptedChainIds: Set<string>\n): RenameHop[] => {\n const keptIndexes = new Set<number>();\n groupRenameChains(uid, renames).forEach((chain) => {\n if (acceptedChainIds.has(chain.id)) {\n chain.hopIndexes.forEach((index) => keptIndexes.add(index));\n }\n });\n\n return renames.filter((_, index) => keptIndexes.has(index));\n};\n\n/**\n * Mutates the request payload so each type keeps only the rename chains the\n * user accepted; types left with no accepted hops drop their `renames` entirely.\n */\nexport const applyRenameDecisions = (\n requestData: { contentTypes: RenameAwareEntry[]; components: RenameAwareEntry[] },\n acceptedKeys: Set<string>\n): void => {\n const apply = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const kept = filterRenamesByAcceptedChains(entry.uid, entry.renames, acceptedKeys);\n if (kept.length > 0) {\n entry.renames = kept;\n } else {\n delete entry.renames;\n }\n }\n });\n };\n\n apply(requestData.contentTypes ?? []);\n apply(requestData.components ?? []);\n};\n"],"names":["getAttributeRenameDecision","mode","shouldPromptForRenamesBeforeSave","RenameMigrationModal","renames","onConfirm","onCancel","formatMessage","useIntl","descriptionId","React","useId","checkedKeys","setCheckedKeys","useState","Set","map","rename","key","chainNames","pairs","pair","oldName","join","toggle","checked","previous","next","add","delete","_jsx","Modal","Root","open","onOpenChange","_jsxs","Content","aria-describedby","Header","Title","id","getTrad","defaultMessage","Body","Flex","direction","alignItems","gap","Typography","variant","textColor","justifyContent","hasRadius","borderColor","padding","fontWeight","ArrowRight","width","height","fill","newName","isSwapBack","via","length","names","typeName","Checkbox","aria-label","has","onCheckedChange","Footer","Close","Button","onClick","disabled","size","getTypeName","entry","displayName","uid","toPendingRename","chain","hopIndexes","index","collectPendingRenames","requestData","items","visit","entries","forEach","action","Array","isArray","groupRenameChains","push","contentTypes","components","filterRenamesByAcceptedChains","acceptedChainIds","keptIndexes","filter","_","applyRenameDecisions","acceptedKeys","apply","kept"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RenameMigrationModal.mjs","sources":["../../../../admin/src/components/DataManager/RenameMigrationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Checkbox, Flex, Modal, Typography } from '@strapi/design-system';\nimport { ArrowRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\n\nimport { groupRenameChains, type RenameChain, type RenamePair } from './utils/groupRenameChains';\n\nimport type { RenameHop } from '../../types';\n\nexport type AttributeRenameMigrationMode =\n | 'always'\n | 'never'\n | 'prompt-after-edit'\n | 'prompt-before-save';\n\nexport type AttributeRenameDecision = boolean | 'prompt';\n\nexport const getAttributeRenameDecision = (\n mode: AttributeRenameMigrationMode\n): AttributeRenameDecision => {\n if (mode === 'never') {\n return false;\n }\n\n if (mode === 'prompt-after-edit') {\n return 'prompt';\n }\n\n return true;\n};\n\nexport const shouldPromptForRenamesBeforeSave = (mode: AttributeRenameMigrationMode): boolean =>\n mode === 'prompt-before-save';\n\n/**\n * One rename *chain* on an existing type, shown as a single row in the\n * confirmation modal. Consent is given per chain, never per hop: replaying a\n * partial chain either fails or silently skips hops whose target column still\n * exists. `key` is the chain id (`${uid}:chain:${firstHopIndex}`) so a decision\n * maps back to every hop of that chain in the type's ordered `renames` array.\n */\nexport interface PendingRename {\n key: string;\n uid: string;\n typeName: string;\n /** Net effect of the chain (`old -> new`); the raw hops for a pure swap-back. */\n pairs: RenamePair[];\n /** Intermediate names the chain routes through (e.g. `tmp`). */\n via: string[];\n /** True when the chain's net effect is empty (fields swapped back) but data still moves. */\n isSwapBack?: boolean;\n}\n\ninterface RenameMigrationModalProps {\n renames: PendingRename[];\n /**\n * Resolves with the keys of the hops the user chose to preserve (every row\n * is checked by default), or an empty set for \"don't preserve data\".\n */\n onConfirm: (acceptedKeys: Set<string>) => void;\n /** Aborts the current edit or save and returns to editing. */\n onCancel: () => void;\n}\n\nconst RenameMigrationModal = ({ renames, onConfirm, onCancel }: RenameMigrationModalProps) => {\n const { formatMessage } = useIntl();\n const descriptionId = React.useId();\n\n const [checkedKeys, setCheckedKeys] = React.useState<Set<string>>(\n () => new Set(renames.map((rename) => rename.key))\n );\n\n const chainNames = (rename: PendingRename) => rename.pairs.map((pair) => pair.oldName).join(', ');\n\n const toggle = (key: string, checked: boolean) => {\n setCheckedKeys((previous) => {\n const next = new Set(previous);\n if (checked) {\n next.add(key);\n } else {\n next.delete(key);\n }\n return next;\n });\n };\n\n return (\n <Modal.Root open onOpenChange={(open) => !open && onCancel()}>\n <Modal.Content aria-describedby={descriptionId}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('migration.confirmation.title'),\n defaultMessage: 'Preserve data for renamed fields?',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography id={descriptionId} variant=\"omega\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.description'),\n defaultMessage:\n 'You renamed the fields below. Strapi can generate a migration to preserve existing data by renaming the underlying database columns. Untick a rename to let those fields start empty instead.',\n })}\n </Typography>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {renames.map((rename) => (\n <Flex\n key={rename.key}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n hasRadius\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n {rename.pairs.map((pair) => (\n <Flex key={`${pair.oldName}->${pair.newName}`} gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.oldName}\n </Typography>\n <ArrowRight width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.newName}\n </Typography>\n </Flex>\n ))}\n {rename.isSwapBack && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.field.swap'),\n defaultMessage:\n 'Fields swapped back to their original names; data still moves.',\n })}\n </Typography>\n )}\n {rename.via.length > 0 && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.via'),\n defaultMessage: 'via {names}',\n },\n { names: rename.via.join(', ') }\n )}\n </Typography>\n )}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.in'),\n defaultMessage: 'in {typeName}',\n },\n { typeName: rename.typeName }\n )}\n </Typography>\n </Flex>\n <Checkbox\n aria-label={formatMessage(\n {\n id: getTrad('migration.confirmation.field.preserve'),\n defaultMessage: 'Preserve data of {names} in {typeName}',\n },\n { names: chainNames(rename), typeName: rename.typeName }\n )}\n checked={checkedKeys.has(rename.key)}\n onCheckedChange={(checked) => toggle(rename.key, checked === true)}\n />\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={onCancel}>\n {formatMessage({\n id: getTrad('migration.confirmation.cancel'),\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Modal.Close>\n <Button variant=\"danger-light\" onClick={() => onConfirm(new Set())}>\n {formatMessage({\n id: getTrad('migration.confirmation.decline'),\n defaultMessage: \"Don't preserve data\",\n })}\n </Button>\n <Button disabled={checkedKeys.size === 0} onClick={() => onConfirm(checkedKeys)}>\n {formatMessage({\n id: getTrad('migration.confirmation.confirm'),\n defaultMessage: 'Preserve data',\n })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nexport { RenameMigrationModal };\n\nconst getTypeName = (entry: { displayName?: string; uid: string }): string =>\n entry.displayName ?? entry.uid;\n\ntype RenameAwareEntry = {\n action?: string;\n uid: string;\n displayName?: string;\n renames?: RenameHop[];\n};\n\n/**\n * Builds the modal row for one chain. A chain whose net effect is empty (the\n * user renamed fields back to their original names through a swap) still has\n * to run every hop, so its raw hops are shown instead of an empty row.\n */\nexport const toPendingRename = (\n chain: RenameChain,\n renames: RenameHop[],\n { uid, typeName }: { uid: string; typeName: string }\n): PendingRename => {\n const isSwapBack = chain.pairs.length === 0;\n\n return {\n key: chain.id,\n uid,\n typeName,\n pairs: isSwapBack ? chain.hopIndexes.map((index) => renames[index]) : chain.pairs,\n via: chain.via,\n ...(isSwapBack ? { isSwapBack: true } : {}),\n };\n};\n\n/**\n * Groups the ordered per-type `renames` arrays in a request payload into\n * chains for display, one `PendingRename` per chain, preserving order.\n */\nexport const collectPendingRenames = (requestData: {\n contentTypes: RenameAwareEntry[];\n components: RenameAwareEntry[];\n}): PendingRename[] => {\n const items: PendingRename[] = [];\n\n const visit = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const { renames } = entry;\n groupRenameChains(entry.uid, renames).forEach((chain) => {\n items.push(\n toPendingRename(chain, renames, { uid: entry.uid, typeName: getTypeName(entry) })\n );\n });\n }\n });\n };\n\n visit(requestData.contentTypes ?? []);\n visit(requestData.components ?? []);\n\n return items;\n};\n\n/**\n * Keeps only the hops of `renames` that belong to an accepted chain. Filtering\n * by index preserves the original order, and a chain is always kept or dropped\n * as a whole, so the result can never be a truncated chain.\n */\nexport const filterRenamesByAcceptedChains = (\n uid: string,\n renames: RenameHop[],\n acceptedChainIds: Set<string>\n): RenameHop[] => {\n const keptIndexes = new Set<number>();\n groupRenameChains(uid, renames).forEach((chain) => {\n if (acceptedChainIds.has(chain.id)) {\n chain.hopIndexes.forEach((index) => keptIndexes.add(index));\n }\n });\n\n return renames.filter((_, index) => keptIndexes.has(index));\n};\n\n/**\n * Mutates the request payload so each type keeps only the rename chains the\n * user accepted; types left with no accepted hops drop their `renames` entirely.\n */\nexport const applyRenameDecisions = (\n requestData: { contentTypes: RenameAwareEntry[]; components: RenameAwareEntry[] },\n acceptedKeys: Set<string>\n): void => {\n const apply = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const kept = filterRenamesByAcceptedChains(entry.uid, entry.renames, acceptedKeys);\n if (kept.length > 0) {\n entry.renames = kept;\n } else {\n delete entry.renames;\n }\n }\n });\n };\n\n apply(requestData.contentTypes ?? []);\n apply(requestData.components ?? []);\n};\n"],"names":["getAttributeRenameDecision","mode","shouldPromptForRenamesBeforeSave","RenameMigrationModal","renames","onConfirm","onCancel","formatMessage","useIntl","descriptionId","React","useId","checkedKeys","setCheckedKeys","useState","Set","map","rename","key","chainNames","pairs","pair","oldName","join","toggle","checked","previous","next","add","delete","_jsx","Modal","Root","open","onOpenChange","_jsxs","Content","aria-describedby","Header","Title","id","getTrad","defaultMessage","Body","Flex","direction","alignItems","gap","Typography","variant","textColor","justifyContent","hasRadius","borderColor","padding","fontWeight","ArrowRight","width","height","fill","newName","isSwapBack","via","length","names","typeName","Checkbox","aria-label","has","onCheckedChange","Footer","Close","Button","onClick","disabled","size","getTypeName","entry","displayName","uid","toPendingRename","chain","hopIndexes","index","collectPendingRenames","requestData","items","visit","entries","forEach","action","Array","isArray","groupRenameChains","push","contentTypes","components","filterRenamesByAcceptedChains","acceptedChainIds","keptIndexes","filter","_","applyRenameDecisions","acceptedKeys","apply","kept"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RenameMigrationModal.mjs","sources":["../../../../admin/src/components/DataManager/RenameMigrationModal.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Button, Checkbox, Flex, Modal, Typography } from '@strapi/design-system';\nimport { ArrowRight } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils/getTrad';\n\nimport { groupRenameChains, type RenameChain, type RenamePair } from './utils/groupRenameChains';\n\nimport type { RenameHop } from '../../types';\n\nexport type AttributeRenameMigrationMode =\n 'always' | 'never' | 'prompt-after-edit' | 'prompt-before-save';\n\nexport type AttributeRenameDecision = boolean | 'prompt';\n\nexport const getAttributeRenameDecision = (\n mode: AttributeRenameMigrationMode\n): AttributeRenameDecision => {\n if (mode === 'never') {\n return false;\n }\n\n if (mode === 'prompt-after-edit') {\n return 'prompt';\n }\n\n return true;\n};\n\nexport const shouldPromptForRenamesBeforeSave = (mode: AttributeRenameMigrationMode): boolean =>\n mode === 'prompt-before-save';\n\n/**\n * One rename *chain* on an existing type, shown as a single row in the\n * confirmation modal. Consent is given per chain, never per hop: replaying a\n * partial chain either fails or silently skips hops whose target column still\n * exists. `key` is the chain id (`${uid}:chain:${firstHopIndex}`) so a decision\n * maps back to every hop of that chain in the type's ordered `renames` array.\n */\nexport interface PendingRename {\n key: string;\n uid: string;\n typeName: string;\n /** Net effect of the chain (`old -> new`); the raw hops for a pure swap-back. */\n pairs: RenamePair[];\n /** Intermediate names the chain routes through (e.g. `tmp`). */\n via: string[];\n /** True when the chain's net effect is empty (fields swapped back) but data still moves. */\n isSwapBack?: boolean;\n}\n\ninterface RenameMigrationModalProps {\n renames: PendingRename[];\n /**\n * Resolves with the keys of the hops the user chose to preserve (every row\n * is checked by default), or an empty set for \"don't preserve data\".\n */\n onConfirm: (acceptedKeys: Set<string>) => void;\n /** Aborts the current edit or save and returns to editing. */\n onCancel: () => void;\n}\n\nconst RenameMigrationModal = ({ renames, onConfirm, onCancel }: RenameMigrationModalProps) => {\n const { formatMessage } = useIntl();\n const descriptionId = React.useId();\n\n const [checkedKeys, setCheckedKeys] = React.useState<Set<string>>(\n () => new Set(renames.map((rename) => rename.key))\n );\n\n const chainNames = (rename: PendingRename) => rename.pairs.map((pair) => pair.oldName).join(', ');\n\n const toggle = (key: string, checked: boolean) => {\n setCheckedKeys((previous) => {\n const next = new Set(previous);\n if (checked) {\n next.add(key);\n } else {\n next.delete(key);\n }\n return next;\n });\n };\n\n return (\n <Modal.Root open onOpenChange={(open) => !open && onCancel()}>\n <Modal.Content aria-describedby={descriptionId}>\n <Modal.Header>\n <Modal.Title>\n {formatMessage({\n id: getTrad('migration.confirmation.title'),\n defaultMessage: 'Preserve data for renamed fields?',\n })}\n </Modal.Title>\n </Modal.Header>\n <Modal.Body>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography id={descriptionId} variant=\"omega\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.description'),\n defaultMessage:\n 'You renamed the fields below. Strapi can generate a migration to preserve existing data by renaming the underlying database columns. Untick a rename to let those fields start empty instead.',\n })}\n </Typography>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={2}>\n {renames.map((rename) => (\n <Flex\n key={rename.key}\n justifyContent=\"space-between\"\n alignItems=\"center\"\n hasRadius\n borderColor=\"neutral200\"\n padding={3}\n gap={3}\n >\n <Flex direction=\"column\" alignItems=\"start\" gap={1}>\n {rename.pairs.map((pair) => (\n <Flex key={`${pair.oldName}->${pair.newName}`} gap={2} alignItems=\"center\">\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.oldName}\n </Typography>\n <ArrowRight width=\"1.2rem\" height=\"1.2rem\" fill=\"neutral500\" />\n <Typography variant=\"omega\" fontWeight=\"bold\">\n {pair.newName}\n </Typography>\n </Flex>\n ))}\n {rename.isSwapBack && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('migration.confirmation.field.swap'),\n defaultMessage:\n 'Fields swapped back to their original names; data still moves.',\n })}\n </Typography>\n )}\n {rename.via.length > 0 && (\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.via'),\n defaultMessage: 'via {names}',\n },\n { names: rename.via.join(', ') }\n )}\n </Typography>\n )}\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage(\n {\n id: getTrad('migration.confirmation.field.in'),\n defaultMessage: 'in {typeName}',\n },\n { typeName: rename.typeName }\n )}\n </Typography>\n </Flex>\n <Checkbox\n aria-label={formatMessage(\n {\n id: getTrad('migration.confirmation.field.preserve'),\n defaultMessage: 'Preserve data of {names} in {typeName}',\n },\n { names: chainNames(rename), typeName: rename.typeName }\n )}\n checked={checkedKeys.has(rename.key)}\n onCheckedChange={(checked) => toggle(rename.key, checked === true)}\n />\n </Flex>\n ))}\n </Flex>\n </Flex>\n </Modal.Body>\n <Modal.Footer>\n <Modal.Close>\n <Button variant=\"tertiary\" onClick={onCancel}>\n {formatMessage({\n id: getTrad('migration.confirmation.cancel'),\n defaultMessage: 'Cancel',\n })}\n </Button>\n </Modal.Close>\n <Button variant=\"danger-light\" onClick={() => onConfirm(new Set())}>\n {formatMessage({\n id: getTrad('migration.confirmation.decline'),\n defaultMessage: \"Don't preserve data\",\n })}\n </Button>\n <Button disabled={checkedKeys.size === 0} onClick={() => onConfirm(checkedKeys)}>\n {formatMessage({\n id: getTrad('migration.confirmation.confirm'),\n defaultMessage: 'Preserve data',\n })}\n </Button>\n </Modal.Footer>\n </Modal.Content>\n </Modal.Root>\n );\n};\n\nexport { RenameMigrationModal };\n\nconst getTypeName = (entry: { displayName?: string; uid: string }): string =>\n entry.displayName ?? entry.uid;\n\ntype RenameAwareEntry = {\n action?: string;\n uid: string;\n displayName?: string;\n renames?: RenameHop[];\n};\n\n/**\n * Builds the modal row for one chain. A chain whose net effect is empty (the\n * user renamed fields back to their original names through a swap) still has\n * to run every hop, so its raw hops are shown instead of an empty row.\n */\nexport const toPendingRename = (\n chain: RenameChain,\n renames: RenameHop[],\n { uid, typeName }: { uid: string; typeName: string }\n): PendingRename => {\n const isSwapBack = chain.pairs.length === 0;\n\n return {\n key: chain.id,\n uid,\n typeName,\n pairs: isSwapBack ? chain.hopIndexes.map((index) => renames[index]) : chain.pairs,\n via: chain.via,\n ...(isSwapBack ? { isSwapBack: true } : {}),\n };\n};\n\n/**\n * Groups the ordered per-type `renames` arrays in a request payload into\n * chains for display, one `PendingRename` per chain, preserving order.\n */\nexport const collectPendingRenames = (requestData: {\n contentTypes: RenameAwareEntry[];\n components: RenameAwareEntry[];\n}): PendingRename[] => {\n const items: PendingRename[] = [];\n\n const visit = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const { renames } = entry;\n groupRenameChains(entry.uid, renames).forEach((chain) => {\n items.push(\n toPendingRename(chain, renames, { uid: entry.uid, typeName: getTypeName(entry) })\n );\n });\n }\n });\n };\n\n visit(requestData.contentTypes ?? []);\n visit(requestData.components ?? []);\n\n return items;\n};\n\n/**\n * Keeps only the hops of `renames` that belong to an accepted chain. Filtering\n * by index preserves the original order, and a chain is always kept or dropped\n * as a whole, so the result can never be a truncated chain.\n */\nexport const filterRenamesByAcceptedChains = (\n uid: string,\n renames: RenameHop[],\n acceptedChainIds: Set<string>\n): RenameHop[] => {\n const keptIndexes = new Set<number>();\n groupRenameChains(uid, renames).forEach((chain) => {\n if (acceptedChainIds.has(chain.id)) {\n chain.hopIndexes.forEach((index) => keptIndexes.add(index));\n }\n });\n\n return renames.filter((_, index) => keptIndexes.has(index));\n};\n\n/**\n * Mutates the request payload so each type keeps only the rename chains the\n * user accepted; types left with no accepted hops drop their `renames` entirely.\n */\nexport const applyRenameDecisions = (\n requestData: { contentTypes: RenameAwareEntry[]; components: RenameAwareEntry[] },\n acceptedKeys: Set<string>\n): void => {\n const apply = (entries: RenameAwareEntry[]) => {\n entries.forEach((entry) => {\n if (entry.action === 'update' && Array.isArray(entry.renames)) {\n const kept = filterRenamesByAcceptedChains(entry.uid, entry.renames, acceptedKeys);\n if (kept.length > 0) {\n entry.renames = kept;\n } else {\n delete entry.renames;\n }\n }\n });\n };\n\n apply(requestData.contentTypes ?? []);\n apply(requestData.components ?? []);\n};\n"],"names":["getAttributeRenameDecision","mode","shouldPromptForRenamesBeforeSave","RenameMigrationModal","renames","onConfirm","onCancel","formatMessage","useIntl","descriptionId","React","useId","checkedKeys","setCheckedKeys","useState","Set","map","rename","key","chainNames","pairs","pair","oldName","join","toggle","checked","previous","next","add","delete","_jsx","Modal","Root","open","onOpenChange","_jsxs","Content","aria-describedby","Header","Title","id","getTrad","defaultMessage","Body","Flex","direction","alignItems","gap","Typography","variant","textColor","justifyContent","hasRadius","borderColor","padding","fontWeight","ArrowRight","width","height","fill","newName","isSwapBack","via","length","names","typeName","Checkbox","aria-label","has","onCheckedChange","Footer","Close","Button","onClick","disabled","size","getTypeName","entry","displayName","uid","toPendingRename","chain","hopIndexes","index","collectPendingRenames","requestData","items","visit","entries","forEach","action","Array","isArray","groupRenameChains","push","contentTypes","components","filterRenamesByAcceptedChains","acceptedChainIds","keptIndexes","filter","_","applyRenameDecisions","acceptedKeys","apply","kept"],"mappings":";;;;;;;;AAiBO,MAAMA,6BAA6B,CACxCC,IAAAA,GAAAA;AAEA,IAAA,IAAIA,SAAS,OAAA,EAAS;QACpB,OAAO,KAAA;AACT,IAAA;AAEA,IAAA,IAAIA,SAAS,mBAAA,EAAqB;QAChC,OAAO,QAAA;AACT,IAAA;IAEA,OAAO,IAAA;AACT;AAEO,MAAMC,gCAAAA,GAAmC,CAACD,IAAAA,GAC/CA,SAAS;AAgCX,MAAME,oBAAAA,GAAuB,CAAC,EAAEC,OAAO,EAAEC,SAAS,EAAEC,QAAQ,EAA6B,GAAA;IACvF,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAMC,aAAAA,GAAgBC,MAAMC,KAAK,EAAA;AAEjC,IAAA,MAAM,CAACC,WAAAA,EAAaC,cAAAA,CAAe,GAAGH,KAAAA,CAAMI,QAAQ,CAClD,IAAM,IAAIC,GAAAA,CAAIX,QAAQY,GAAG,CAAC,CAACC,MAAAA,GAAWA,OAAOC,GAAG,CAAA,CAAA,CAAA;AAGlD,IAAA,MAAMC,UAAAA,GAAa,CAACF,MAAAA,GAA0BA,MAAAA,CAAOG,KAAK,CAACJ,GAAG,CAAC,CAACK,IAAAA,GAASA,IAAAA,CAAKC,OAAO,CAAA,CAAEC,IAAI,CAAC,IAAA,CAAA;IAE5F,MAAMC,MAAAA,GAAS,CAACN,GAAAA,EAAaO,OAAAA,GAAAA;AAC3BZ,QAAAA,cAAAA,CAAe,CAACa,QAAAA,GAAAA;YACd,MAAMC,IAAAA,GAAO,IAAIZ,GAAAA,CAAIW,QAAAA,CAAAA;AACrB,YAAA,IAAID,OAAAA,EAAS;AACXE,gBAAAA,IAAAA,CAAKC,GAAG,CAACV,GAAAA,CAAAA;YACX,CAAA,MAAO;AACLS,gBAAAA,IAAAA,CAAKE,MAAM,CAACX,GAAAA,CAAAA;AACd,YAAA;YACA,OAAOS,IAAAA;AACT,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEA,qBACEG,GAAA,CAACC,MAAMC,IAAI,EAAA;QAACC,IAAI,EAAA,IAAA;QAACC,YAAAA,EAAc,CAACD,IAAAA,GAAS,CAACA,IAAAA,IAAQ3B,QAAAA,EAAAA;gCAChD6B,IAAA,CAACJ,MAAMK,OAAO,EAAA;YAACC,kBAAAA,EAAkB5B,aAAAA;;AAC/B,8BAAAqB,GAAA,CAACC,MAAMO,MAAM,EAAA;4CACXR,GAAA,CAACC,MAAMQ,KAAK,EAAA;kCACThC,aAAAA,CAAc;AACbiC,4BAAAA,EAAAA,EAAIC,OAAAA,CAAQ,8BAAA,CAAA;4BACZC,cAAAA,EAAgB;AAClB,yBAAA;;;AAGJ,8BAAAZ,GAAA,CAACC,MAAMY,IAAI,EAAA;AACT,oBAAA,QAAA,gBAAAR,IAAA,CAACS,IAAAA,EAAAA;wBAAKC,SAAAA,EAAU,QAAA;wBAASC,UAAAA,EAAW,SAAA;wBAAUC,GAAAA,EAAK,CAAA;;0CACjDjB,GAAA,CAACkB,UAAAA,EAAAA;gCAAWR,EAAAA,EAAI/B,aAAAA;gCAAewC,OAAAA,EAAQ,OAAA;gCAAQC,SAAAA,EAAU,YAAA;0CACtD3C,aAAAA,CAAc;AACbiC,oCAAAA,EAAAA,EAAIC,OAAAA,CAAQ,oCAAA,CAAA;oCACZC,cAAAA,EACE;AACJ,iCAAA;;0CAEFZ,GAAA,CAACc,IAAAA,EAAAA;gCAAKC,SAAAA,EAAU,QAAA;gCAASC,UAAAA,EAAW,SAAA;gCAAUC,GAAAA,EAAK,CAAA;AAChD3C,gCAAAA,QAAAA,EAAAA,OAAAA,CAAQY,GAAG,CAAC,CAACC,MAAAA,iBACZkB,IAAA,CAACS,IAAAA,EAAAA;wCAECO,cAAAA,EAAe,eAAA;wCACfL,UAAAA,EAAW,QAAA;wCACXM,SAAS,EAAA,IAAA;wCACTC,WAAAA,EAAY,YAAA;wCACZC,OAAAA,EAAS,CAAA;wCACTP,GAAAA,EAAK,CAAA;;0DAELZ,IAAA,CAACS,IAAAA,EAAAA;gDAAKC,SAAAA,EAAU,QAAA;gDAASC,UAAAA,EAAW,OAAA;gDAAQC,GAAAA,EAAK,CAAA;;AAC9C9B,oDAAAA,MAAAA,CAAOG,KAAK,CAACJ,GAAG,CAAC,CAACK,qBACjBc,IAAA,CAACS,IAAAA,EAAAA;4DAA8CG,GAAAA,EAAK,CAAA;4DAAGD,UAAAA,EAAW,QAAA;;8EAChEhB,GAAA,CAACkB,UAAAA,EAAAA;oEAAWC,OAAAA,EAAQ,OAAA;oEAAQM,UAAAA,EAAW,MAAA;AACpClC,oEAAAA,QAAAA,EAAAA,IAAAA,CAAKC;;8EAERQ,GAAA,CAAC0B,UAAAA,EAAAA;oEAAWC,KAAAA,EAAM,QAAA;oEAASC,MAAAA,EAAO,QAAA;oEAASC,IAAAA,EAAK;;8EAChD7B,GAAA,CAACkB,UAAAA,EAAAA;oEAAWC,OAAAA,EAAQ,OAAA;oEAAQM,UAAAA,EAAW,MAAA;AACpClC,oEAAAA,QAAAA,EAAAA,IAAAA,CAAKuC;;;AANC,yDAAA,EAAA,CAAA,EAAGvC,KAAKC,OAAO,CAAC,EAAE,EAAED,IAAAA,CAAKuC,OAAO,CAAA,CAAE,CAAA,CAAA;oDAU9C3C,MAAAA,CAAO4C,UAAU,kBAChB/B,GAAA,CAACkB,UAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CAAc;AACbiC,4DAAAA,EAAAA,EAAIC,OAAAA,CAAQ,mCAAA,CAAA;4DACZC,cAAAA,EACE;AACJ,yDAAA;;AAGHzB,oDAAAA,MAAAA,CAAO6C,GAAG,CAACC,MAAM,GAAG,mBACnBjC,GAAA,CAACkB,UAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CACC;AACEiC,4DAAAA,EAAAA,EAAIC,OAAAA,CAAQ,kCAAA,CAAA;4DACZC,cAAAA,EAAgB;yDAClB,EACA;AAAEsB,4DAAAA,KAAAA,EAAO/C,MAAAA,CAAO6C,GAAG,CAACvC,IAAI,CAAC,IAAA;AAAM,yDAAA;;kEAIrCO,GAAA,CAACkB,UAAAA,EAAAA;wDAAWC,OAAAA,EAAQ,IAAA;wDAAKC,SAAAA,EAAU,YAAA;kEAChC3C,aAAAA,CACC;AACEiC,4DAAAA,EAAAA,EAAIC,OAAAA,CAAQ,iCAAA,CAAA;4DACZC,cAAAA,EAAgB;yDAClB,EACA;AAAEuB,4DAAAA,QAAAA,EAAUhD,OAAOgD;AAAS,yDAAA;;;;0DAIlCnC,GAAA,CAACoC,QAAAA,EAAAA;AACCC,gDAAAA,YAAAA,EAAY5D,aAAAA,CACV;AACEiC,oDAAAA,EAAAA,EAAIC,OAAAA,CAAQ,uCAAA,CAAA;oDACZC,cAAAA,EAAgB;iDAClB,EACA;AAAEsB,oDAAAA,KAAAA,EAAO7C,UAAAA,CAAWF,MAAAA,CAAAA;AAASgD,oDAAAA,QAAAA,EAAUhD,OAAOgD;AAAS,iDAAA,CAAA;AAEzDxC,gDAAAA,OAAAA,EAASb,WAAAA,CAAYwD,GAAG,CAACnD,MAAAA,CAAOC,GAAG,CAAA;AACnCmD,gDAAAA,eAAAA,EAAiB,CAAC5C,OAAAA,GAAYD,MAAAA,CAAOP,MAAAA,CAAOC,GAAG,EAAEO,OAAAA,KAAY,IAAA;;;AA3D1DR,qCAAAA,EAAAA,MAAAA,CAAOC,GAAG,CAAA;;;;;AAkEzB,8BAAAiB,IAAA,CAACJ,MAAMuC,MAAM,EAAA;;AACX,sCAAAxC,GAAA,CAACC,MAAMwC,KAAK,EAAA;AACV,4BAAA,QAAA,gBAAAzC,GAAA,CAAC0C,MAAAA,EAAAA;gCAAOvB,OAAAA,EAAQ,UAAA;gCAAWwB,OAAAA,EAASnE,QAAAA;0CACjCC,aAAAA,CAAc;AACbiC,oCAAAA,EAAAA,EAAIC,OAAAA,CAAQ,+BAAA,CAAA;oCACZC,cAAAA,EAAgB;AAClB,iCAAA;;;sCAGJZ,GAAA,CAAC0C,MAAAA,EAAAA;4BAAOvB,OAAAA,EAAQ,cAAA;4BAAewB,OAAAA,EAAS,IAAMpE,UAAU,IAAIU,GAAAA,EAAAA,CAAAA;sCACzDR,aAAAA,CAAc;AACbiC,gCAAAA,EAAAA,EAAIC,OAAAA,CAAQ,gCAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA;;sCAEFZ,GAAA,CAAC0C,MAAAA,EAAAA;4BAAOE,QAAAA,EAAU9D,WAAAA,CAAY+D,IAAI,KAAK,CAAA;AAAGF,4BAAAA,OAAAA,EAAS,IAAMpE,SAAAA,CAAUO,WAAAA,CAAAA;sCAChEL,aAAAA,CAAc;AACbiC,gCAAAA,EAAAA,EAAIC,OAAAA,CAAQ,gCAAA,CAAA;gCACZC,cAAAA,EAAgB;AAClB,6BAAA;;;;;;;AAMZ;AAIA,MAAMkC,cAAc,CAACC,KAAAA,GACnBA,MAAMC,WAAW,IAAID,MAAME,GAAG;AAShC;;;;IAKO,MAAMC,eAAAA,GAAkB,CAC7BC,KAAAA,EACA7E,SACA,EAAE2E,GAAG,EAAEd,QAAQ,EAAqC,GAAA;AAEpD,IAAA,MAAMJ,UAAAA,GAAaoB,KAAAA,CAAM7D,KAAK,CAAC2C,MAAM,KAAK,CAAA;IAE1C,OAAO;AACL7C,QAAAA,GAAAA,EAAK+D,MAAMzC,EAAE;AACbuC,QAAAA,GAAAA;AACAd,QAAAA,QAAAA;AACA7C,QAAAA,KAAAA,EAAOyC,UAAAA,GAAaoB,KAAAA,CAAMC,UAAU,CAAClE,GAAG,CAAC,CAACmE,KAAAA,GAAU/E,OAAO,CAAC+E,KAAAA,CAAM,CAAA,GAAIF,MAAM7D,KAAK;AACjF0C,QAAAA,GAAAA,EAAKmB,MAAMnB,GAAG;AACd,QAAA,GAAID,UAAAA,GAAa;YAAEA,UAAAA,EAAY;AAAK,SAAA,GAAI;AAC1C,KAAA;AACF;AAEA;;;IAIO,MAAMuB,qBAAAA,GAAwB,CAACC,WAAAA,GAAAA;AAIpC,IAAA,MAAMC,QAAyB,EAAE;AAEjC,IAAA,MAAMC,QAAQ,CAACC,OAAAA,GAAAA;QACbA,OAAAA,CAAQC,OAAO,CAAC,CAACZ,KAAAA,GAAAA;YACf,IAAIA,KAAAA,CAAMa,MAAM,KAAK,QAAA,IAAYC,MAAMC,OAAO,CAACf,KAAAA,CAAMzE,OAAO,CAAA,EAAG;gBAC7D,MAAM,EAAEA,OAAO,EAAE,GAAGyE,KAAAA;AACpBgB,gBAAAA,iBAAAA,CAAkBhB,MAAME,GAAG,EAAE3E,OAAAA,CAAAA,CAASqF,OAAO,CAAC,CAACR,KAAAA,GAAAA;AAC7CK,oBAAAA,KAAAA,CAAMQ,IAAI,CACRd,eAAAA,CAAgBC,KAAAA,EAAO7E,OAAAA,EAAS;AAAE2E,wBAAAA,GAAAA,EAAKF,MAAME,GAAG;AAAEd,wBAAAA,QAAAA,EAAUW,WAAAA,CAAYC,KAAAA;AAAO,qBAAA,CAAA,CAAA;AAEnF,gBAAA,CAAA,CAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEAU,KAAAA,CAAMF,WAAAA,CAAYU,YAAY,IAAI,EAAE,CAAA;IACpCR,KAAAA,CAAMF,WAAAA,CAAYW,UAAU,IAAI,EAAE,CAAA;IAElC,OAAOV,KAAAA;AACT;AAEA;;;;AAIC,IACM,MAAMW,6BAAAA,GAAgC,CAC3ClB,KACA3E,OAAAA,EACA8F,gBAAAA,GAAAA;AAEA,IAAA,MAAMC,cAAc,IAAIpF,GAAAA,EAAAA;AACxB8E,IAAAA,iBAAAA,CAAkBd,GAAAA,EAAK3E,OAAAA,CAAAA,CAASqF,OAAO,CAAC,CAACR,KAAAA,GAAAA;AACvC,QAAA,IAAIiB,gBAAAA,CAAiB9B,GAAG,CAACa,KAAAA,CAAMzC,EAAE,CAAA,EAAG;YAClCyC,KAAAA,CAAMC,UAAU,CAACO,OAAO,CAAC,CAACN,KAAAA,GAAUgB,WAAAA,CAAYvE,GAAG,CAACuD,KAAAA,CAAAA,CAAAA;AACtD,QAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO/E,OAAAA,CAAQgG,MAAM,CAAC,CAACC,GAAGlB,KAAAA,GAAUgB,WAAAA,CAAY/B,GAAG,CAACe,KAAAA,CAAAA,CAAAA;AACtD;AAEA;;;AAGC,IACM,MAAMmB,oBAAAA,GAAuB,CAClCjB,WAAAA,EACAkB,YAAAA,GAAAA;AAEA,IAAA,MAAMC,QAAQ,CAAChB,OAAAA,GAAAA;QACbA,OAAAA,CAAQC,OAAO,CAAC,CAACZ,KAAAA,GAAAA;YACf,IAAIA,KAAAA,CAAMa,MAAM,KAAK,QAAA,IAAYC,MAAMC,OAAO,CAACf,KAAAA,CAAMzE,OAAO,CAAA,EAAG;AAC7D,gBAAA,MAAMqG,OAAOR,6BAAAA,CAA8BpB,KAAAA,CAAME,GAAG,EAAEF,KAAAA,CAAMzE,OAAO,EAAEmG,YAAAA,CAAAA;gBACrE,IAAIE,IAAAA,CAAK1C,MAAM,GAAG,CAAA,EAAG;AACnBc,oBAAAA,KAAAA,CAAMzE,OAAO,GAAGqG,IAAAA;gBAClB,CAAA,MAAO;AACL,oBAAA,OAAO5B,MAAMzE,OAAO;AACtB,gBAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA;IAEAoG,KAAAA,CAAMnB,WAAAA,CAAYU,YAAY,IAAI,EAAE,CAAA;IACpCS,KAAAA,CAAMnB,WAAAA,CAAYW,UAAU,IAAI,EAAE,CAAA;AACpC;;;;"}
|
|
@@ -4,6 +4,7 @@ var merge = require('lodash/merge');
|
|
|
4
4
|
var omit = require('lodash/omit');
|
|
5
5
|
var uniq = require('lodash/uniq');
|
|
6
6
|
var applyPrivateSearchDefault = require('../../utils/applyPrivateSearchDefault.js');
|
|
7
|
+
var conditions = require('../../utils/conditions.js');
|
|
7
8
|
var getRelationType = require('../../utils/getRelationType.js');
|
|
8
9
|
var makeUnique = require('../../utils/makeUnique.js');
|
|
9
10
|
var undoRedo = require('./undoRedo.js');
|
|
@@ -29,10 +30,10 @@ const initialState = {
|
|
|
29
30
|
},
|
|
30
31
|
isLoading: true
|
|
31
32
|
};
|
|
32
|
-
const ONE_SIDE_RELATIONS = [
|
|
33
|
+
const ONE_SIDE_RELATIONS = new Set([
|
|
33
34
|
'oneWay',
|
|
34
35
|
'manyWay'
|
|
35
|
-
];
|
|
36
|
+
]);
|
|
36
37
|
const getOppositeRelation = (originalRelation)=>{
|
|
37
38
|
if (originalRelation === 'manyToOne') {
|
|
38
39
|
return 'oneToMany';
|
|
@@ -142,6 +143,50 @@ const createAttribute = (properties)=>{
|
|
|
142
143
|
recordRename(type, previousAttribute, newAttribute);
|
|
143
144
|
}
|
|
144
145
|
};
|
|
146
|
+
const UID_TARGET_TYPES = new Set([
|
|
147
|
+
'string',
|
|
148
|
+
'text'
|
|
149
|
+
]);
|
|
150
|
+
/**
|
|
151
|
+
* Keeps uid fields attached to a field when it is renamed, whether or not the
|
|
152
|
+
* rename is recorded as a data-preserving hop. A rename that also turns the
|
|
153
|
+
* field into a type a uid cannot target detaches the uid, as deleting it would.
|
|
154
|
+
*/ const renameUIDTargetFields = (type, previousAttribute, newAttribute)=>{
|
|
155
|
+
const oldName = previousAttribute.name;
|
|
156
|
+
const newName = newAttribute?.name;
|
|
157
|
+
if (!newName || oldName === newName) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const isValidTarget = UID_TARGET_TYPES.has(newAttribute.type);
|
|
161
|
+
type.attributes.forEach((attribute)=>{
|
|
162
|
+
if (attribute.type === 'uid' && attribute.targetField === oldName) {
|
|
163
|
+
if (isValidTarget) {
|
|
164
|
+
attribute.targetField = newName;
|
|
165
|
+
} else {
|
|
166
|
+
delete attribute.targetField;
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
});
|
|
170
|
+
};
|
|
171
|
+
/**
|
|
172
|
+
* Points the conditions of the type's other fields at the new name of a renamed
|
|
173
|
+
* field. Runs for every rename, recorded or not, so the conditions follow the
|
|
174
|
+
* field whether or not its data is preserved.
|
|
175
|
+
*/ const renameConditionVars = (type, previousAttribute, newAttribute)=>{
|
|
176
|
+
const oldName = previousAttribute.name;
|
|
177
|
+
const newName = newAttribute?.name;
|
|
178
|
+
if (!newName || oldName === newName) {
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
type.attributes.forEach((attribute)=>{
|
|
182
|
+
conditions.getVisibleConditionEntries(attribute.conditions).forEach(({ fieldVar })=>{
|
|
183
|
+
if (fieldVar.var === oldName) {
|
|
184
|
+
fieldVar.var = newName;
|
|
185
|
+
setAttributeStatus(attribute, 'CHANGED');
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
});
|
|
189
|
+
};
|
|
145
190
|
const setAttributeAt = (type, index, attribute)=>{
|
|
146
191
|
const previousAttribute = type.attributes[index];
|
|
147
192
|
const newStatus = getNewStatus(previousAttribute.status, 'CHANGED');
|
|
@@ -508,7 +553,9 @@ const slice = undoRedo.createUndoRedoSlice({
|
|
|
508
553
|
recordRename,
|
|
509
554
|
declineRename
|
|
510
555
|
});
|
|
556
|
+
renameConditionVars(type, previousAttribute, attributeToSet);
|
|
511
557
|
setAttributeAt(type, initialAttributeIndex, attributeToSet);
|
|
558
|
+
renameUIDTargetFields(type, previousAttribute, attributeToSet);
|
|
512
559
|
if (previousAttribute.type !== attributeToSet.type) {
|
|
513
560
|
return;
|
|
514
561
|
}
|
|
@@ -530,7 +577,7 @@ const slice = undoRedo.createUndoRedoSlice({
|
|
|
530
577
|
removeAttributeByName(previousTarget, previousAttribute.targetAttribute);
|
|
531
578
|
}
|
|
532
579
|
const newRelationType = getRelationType.getRelationType(attributeToSet.relation, attributeToSet.targetAttribute);
|
|
533
|
-
const isBidirectionnal = newRelationType !== undefined && !ONE_SIDE_RELATIONS.
|
|
580
|
+
const isBidirectionnal = newRelationType !== undefined && !ONE_SIDE_RELATIONS.has(newRelationType);
|
|
534
581
|
if (isBidirectionnal) {
|
|
535
582
|
const newTargetAttribute = {
|
|
536
583
|
name: attributeToSet.targetAttribute,
|
|
@@ -579,6 +626,8 @@ const slice = undoRedo.createUndoRedoSlice({
|
|
|
579
626
|
recordRename,
|
|
580
627
|
declineRename
|
|
581
628
|
});
|
|
629
|
+
renameUIDTargetFields(type, previousAttribute, attributeToSet);
|
|
630
|
+
renameConditionVars(type, previousAttribute, attributeToSet);
|
|
582
631
|
},
|
|
583
632
|
reloadPlugin: ()=>{
|
|
584
633
|
return initialState;
|
|
@@ -606,7 +655,7 @@ const slice = undoRedo.createUndoRedoSlice({
|
|
|
606
655
|
if (attribute.type === 'relation') {
|
|
607
656
|
const { target, relation, targetAttribute: targetAttributeName } = attribute;
|
|
608
657
|
const relationType = getRelationType.getRelationType(relation, targetAttributeName);
|
|
609
|
-
const isBidirectionnal = !ONE_SIDE_RELATIONS.
|
|
658
|
+
const isBidirectionnal = !ONE_SIDE_RELATIONS.has(relationType);
|
|
610
659
|
if (isBidirectionnal && targetAttributeName) {
|
|
611
660
|
const targetContentType = getType(state, {
|
|
612
661
|
forTarget,
|