@strapi/content-type-builder 5.45.0 → 5.46.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.
@@ -43,6 +43,20 @@ function _interopNamespaceDefault(e) {
43
43
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
44
44
 
45
45
  const selectState = (state)=>state['content-type-builder_dataManagerProvider'] || reducer.initialState;
46
+ /**
47
+ * Tag types registered on the shared `adminApi` instance at runtime by
48
+ * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`
49
+ * (see packages/core/content-manager/admin/src/services/api.ts).
50
+ *
51
+ * The cast is only required because adminApi's compile-time tag union doesn't see
52
+ * tags added downstream from this side of the dependency graph.
53
+ */ const CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [
54
+ 'InitialData',
55
+ 'ContentTypesConfiguration',
56
+ 'ContentTypeSettings',
57
+ 'ComponentConfiguration'
58
+ ];
59
+ const invalidateContentManagerSchemaCaches = ()=>strapiAdmin.adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS);
46
60
  const DataManagerProvider = ({ children })=>{
47
61
  const dispatch = reactRedux.useDispatch();
48
62
  const state = reactRedux.useSelector(selectState);
@@ -72,7 +86,7 @@ const DataManagerProvider = ({ children })=>{
72
86
  ]);
73
87
  const fetchClient = strapiAdmin.useFetchClient();
74
88
  const isInDevelopmentMode = autoReload;
75
- const getDataRef = React__namespace.useRef();
89
+ const getDataRef = React__namespace.useRef(async ()=>undefined);
76
90
  getDataRef.current = async ()=>{
77
91
  try {
78
92
  const [schemaResponse, reservedNamesResponse] = await Promise.all([
@@ -191,6 +205,8 @@ const DataManagerProvider = ({ children })=>{
191
205
  await getDataRef.current();
192
206
  // Update the app's permissions
193
207
  await updatePermissions();
208
+ // Refresh content-manager caches that depend on the CT/component schema.
209
+ dispatch(invalidateContentManagerSchemaCaches());
194
210
  } catch (err) {
195
211
  console.error({
196
212
  err
@@ -1 +1 @@
1
- {"version":3,"file":"DataManagerProvider.js","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\n useGuidedTour,\n GUIDED_TOUR_REQUIRED_ACTIONS,\n} from '@strapi/admin/strapi-admin';\nimport groupBy from 'lodash/groupBy';\nimport isEqual from 'lodash/isEqual';\nimport mapValues from 'lodash/mapValues';\nimport { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\n\nimport type { ContentTypes, ContentType, Components } from '../../types';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\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 isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(isEqual(components, initialComponents) && isEqual(contentTypes, initialContentTypes));\n }, [components, contentTypes, initialComponents, initialContentTypes]);\n\n const fetchClient = useFetchClient();\n\n const isInDevelopmentMode = autoReload;\n\n const getDataRef = React.useRef<any>();\n\n getDataRef.current = async () => {\n try {\n const [schemaResponse, reservedNamesResponse] = await Promise.all([\n fetchClient.get(`/content-type-builder/schema`),\n fetchClient.get(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes } = schemaResponse.data.data;\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n });\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n // Update the app's permissions\n await updatePermissions();\n } 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 isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n addAttribute(payload) {\n dispatch(actions.addAttribute(payload));\n },\n editAttribute(payload) {\n dispatch(actions.editAttribute(payload));\n },\n addCustomFieldAttribute(payload) {\n dispatch(actions.addCustomFieldAttribute(payload));\n },\n editCustomFieldAttribute(payload) {\n dispatch(actions.editCustomFieldAttribute(payload));\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n dispatch(actions.createSchema(payload));\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 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 dispatch(actions.updateSchema(args));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n applyChange(args) {\n dispatch(actions.applyChange(args));\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return <DataManagerContext.Provider value={context}>{children}</DataManagerContext.Provider>;\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["selectState","state","initialState","DataManagerProvider","children","dispatch","useDispatch","useSelector","dispatchGuidedTour","useGuidedTour","s","location","useLocation","sessionId","ctbSessionId","regenerateSessionId","useCTBSession","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","isSendingContentTypes","keys","length","post","success","adminApi","util","invalidateTags","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createComponentSchema","componentCategory","changeDynamicZoneComponents","forTarget","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsx","DataManagerContext","Provider","value"],"mappings":"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"}
1
+ {"version":3,"file":"DataManagerProvider.js","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\n useGuidedTour,\n GUIDED_TOUR_REQUIRED_ACTIONS,\n} from '@strapi/admin/strapi-admin';\nimport groupBy from 'lodash/groupBy';\nimport isEqual from 'lodash/isEqual';\nimport mapValues from 'lodash/mapValues';\nimport { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\n\nimport type { ContentTypes, ContentType, Components } from '../../types';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\n\n/**\n * Tag types registered on the shared `adminApi` instance at runtime by\n * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`\n * (see packages/core/content-manager/admin/src/services/api.ts).\n *\n * The cast is only required because adminApi's compile-time tag union doesn't see\n * tags added downstream from this side of the dependency graph.\n */\nconst CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [\n 'InitialData',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'ComponentConfiguration',\n] as const;\n\nconst invalidateContentManagerSchemaCaches = () =>\n adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS as never);\n\nconst DataManagerProvider = ({ children }: DataManagerProviderProps) => {\n const dispatch = useDispatch();\n const state = useSelector(selectState);\n const dispatchGuidedTour = useGuidedTour('DataManagerProvider', (s) => s.dispatch);\n const location = useLocation();\n const { sessionId: ctbSessionId, regenerateSessionId } = useCTBSession();\n\n const {\n components,\n contentTypes,\n reservedNames,\n initialComponents,\n initialContentTypes,\n isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(isEqual(components, initialComponents) && isEqual(contentTypes, initialContentTypes));\n }, [components, contentTypes, initialComponents, initialContentTypes]);\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(`/content-type-builder/schema`),\n fetchClient.get(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes } = schemaResponse.data.data;\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n });\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n // Update the app's permissions\n await updatePermissions();\n // Refresh content-manager caches that depend on the CT/component schema.\n dispatch(invalidateContentManagerSchemaCaches());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: false,\n ctbSessionId,\n });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\n dispatchGuidedTour({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema],\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: true,\n ctbSessionId,\n });\n }\n };\n\n const componentsThatHaveOtherComponentInTheirAttributes = React.useMemo(() => {\n return getAllComponentsThatHaveAComponentInTheirAttributes(components);\n }, [components]);\n\n const nestedComponents = React.useMemo(() => {\n return getAllNestedComponents(components);\n }, [components]);\n\n const allComponentsCategories = React.useMemo(() => {\n return retrieveSpecificInfoFromComponents(components, ['category']);\n }, [components]);\n\n const componentsGroupedByCategory = React.useMemo(() => {\n return groupBy(components, 'category');\n }, [components]);\n\n const sortedContentTypesList = React.useMemo(() => {\n return sortContentType(contentTypes);\n }, [contentTypes]);\n\n const context: DataManagerContextValue = {\n componentsThatHaveOtherComponentInTheirAttributes,\n nestedComponents,\n saveSchema,\n reservedNames,\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n addAttribute(payload) {\n dispatch(actions.addAttribute(payload));\n },\n editAttribute(payload) {\n dispatch(actions.editAttribute(payload));\n },\n addCustomFieldAttribute(payload) {\n dispatch(actions.addCustomFieldAttribute(payload));\n },\n editCustomFieldAttribute(payload) {\n dispatch(actions.editCustomFieldAttribute(payload));\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n dispatch(actions.createSchema(payload));\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 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 dispatch(actions.updateSchema(args));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n applyChange(args) {\n dispatch(actions.applyChange(args));\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return <DataManagerContext.Provider value={context}>{children}</DataManagerContext.Provider>;\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["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","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","undefined","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","isSendingContentTypes","keys","length","post","success","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createComponentSchema","componentCategory","changeDynamicZoneComponents","forTarget","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsx","DataManagerContext","Provider","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAMA,cAAc,CAACC,KAAAA,GAClBA,KAAK,CAAC,2CAA2C,IAAIC,oBAAAA;AAExD;;;;;;;AAOC,IACD,MAAMC,iCAAAA,GAAoC;AACxC,IAAA,aAAA;AACA,IAAA,2BAAA;AACA,IAAA,qBAAA;AACA,IAAA;AACD,CAAA;AAED,MAAMC,uCAAuC,IAC3CC,oBAAAA,CAASC,IAAI,CAACC,cAAc,CAACJ,iCAAAA,CAAAA;AAE/B,MAAMK,mBAAAA,GAAsB,CAAC,EAAEC,QAAQ,EAA4B,GAAA;AACjE,IAAA,MAAMC,QAAAA,GAAWC,sBAAAA,EAAAA;AACjB,IAAA,MAAMV,QAAQW,sBAAAA,CAAYZ,WAAAA,CAAAA;AAC1B,IAAA,MAAMa,qBAAqBC,yBAAAA,CAAc,qBAAA,EAAuB,CAACC,CAAAA,GAAMA,EAAEL,QAAQ,CAAA;AACjF,IAAA,MAAMM,QAAAA,GAAWC,0BAAAA,EAAAA;AACjB,IAAA,MAAM,EAAEC,SAAAA,EAAWC,YAAY,EAAEC,mBAAmB,EAAE,GAAGC,2BAAAA,EAAAA;AAEzD,IAAA,MAAM,EACJC,UAAU,EACVC,YAAY,EACZC,aAAa,EACbC,iBAAiB,EACjBC,mBAAmB,EACnBC,SAAS,EACV,GAAG1B,MAAM2B,OAAO;IAEjB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,qBAAqB,EAAEC,uBAAuB,EAAE,GAAGC,oDAAAA,EAAAA;AAC3D,IAAA,MAAMC,oBAAAA,GAAuBC,+CAAAA,EAAAA;AAE7B,IAAA,MAAMC,YAAYC,wBAAAA,CAAa,qBAAA,EAAuB,CAACpC,KAAAA,GAAUA,MAAMmC,SAAS,CAAA;AAChF,IAAA,MAAME,SAASF,SAAAA,CAAU,sBAAA,CAAA;AACzB,IAAA,MAAMG,aAAaC,sBAAAA,CAAW,qBAAA,EAAuB,CAACvC,KAAAA,GAAUA,MAAMsC,UAAU,CAAA;IAChF,MAAM,EAAEE,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,6BAAAA,EAAAA;AACvB,IAAA,MAAMC,qBAAqBC,mBAAAA,CAAQ,qBAAA,EAAuB,CAAC7C,KAAAA,GAAUA,MAAM4C,kBAAkB,CAAA;IAC7F,MAAM,EAAEE,YAAY,EAAE,GAAGC,6CAAAA,EAAAA;AAEzB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IAC/C,MAAMC,mBAAAA,GAAsBF,gBAAAA,CAAMG,MAAM,CAAgB,IAAA,CAAA;IAExD,MAAMC,UAAAA,GAAaJ,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAC/B,QAAA,OAAO,EAAEC,OAAAA,CAAQnC,YAAYG,iBAAAA,CAAAA,IAAsBgC,OAAAA,CAAQlC,cAAcG,mBAAAA,CAAmB,CAAA;IAC9F,CAAA,EAAG;AAACJ,QAAAA,UAAAA;AAAYC,QAAAA,YAAAA;AAAcE,QAAAA,iBAAAA;AAAmBC,QAAAA;AAAoB,KAAA,CAAA;AAErE,IAAA,MAAMgC,WAAAA,GAAcC,0BAAAA,EAAAA;AAEpB,IAAA,MAAMC,mBAAAA,GAAsBrB,UAAAA;AAE5B,IAAA,MAAMsB,UAAAA,GAAaV,gBAAAA,CAAMG,MAAM,CAAsB,UAAYQ,SAAAA,CAAAA;AAEjED,IAAAA,UAAAA,CAAWjC,OAAO,GAAG,UAAA;QACnB,IAAI;AACF,YAAA,MAAM,CAACmC,cAAAA,EAAgBC,qBAAAA,CAAsB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AAChER,gBAAAA,WAAAA,CAAYS,GAAG,CAAC,CAAC,4BAA4B,CAAC,CAAA;AAC9CT,gBAAAA,WAAAA,CAAYS,GAAG,CAAC,CAAC,oCAAoC,CAAC;AACvD,aAAA,CAAA;YAED,MAAM,EAAE7C,UAAU,EAAEC,YAAY,EAAE,GAAGwC,cAAAA,CAAeK,IAAI,CAACA,IAAI;YAE7D1D,QAAAA,CACE2D,eAAAA,CAAQC,IAAI,CAAC;AACXhD,gBAAAA,UAAAA,EAAYiD,SAAAA,CAAUjD,UAAAA,EAAY,CAACkD,SAAAA,IAAe;AAChD,wBAAA,GAAGA,SAAS;wBACZC,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAlD,gBAAAA,YAAAA,EAAcgD,SAAAA,CAAUhD,YAAAA,EAAc,CAACmD,WAAAA,IAAiB;AACtD,wBAAA,GAAGA,WAAW;wBACdD,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAjD,gBAAAA,aAAAA,EAAewC,sBAAsBI;AACvC,aAAA,CAAA,CAAA;AAGF1D,YAAAA,QAAAA,CAAS2D,gBAAQM,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAOC,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB/C,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;oBAAEwC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA/B,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;AACdtB,QAAAA,UAAAA,CAAWjC,OAAO,EAAA;QAClByB,mBAAAA,CAAoBzB,OAAO,GAAGZ,QAAAA,CAASoE,QAAQ;QAE/C,OAAO,IAAA;;AAEL1E,YAAAA,QAAAA,CAAS2D,gBAAQgB,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA;;AAEF,IAAA,CAAA,EAAG,EAAE,CAAA;;AAGLlC,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;QACd,MAAMG,WAAAA,GAActE,SAASoE,QAAQ;QACrC,MAAMG,YAAAA,GAAelC,oBAAoBzB,OAAO;AAChD,QAAA,MAAM4D,QAAAA,GAAW,+BAAA;AAEjB,QAAA,IAAID,YAAAA,EAAc;YAChB,MAAME,SAAAA,GAAYH,WAAAA,CAAYI,QAAQ,CAACF,QAAAA,CAAAA;YACvC,MAAMG,UAAAA,GAAaJ,YAAAA,CAAaG,QAAQ,CAACF,QAAAA,CAAAA;;YAGzC,IAAI,CAACG,cAAcF,SAAAA,EAAW;AAC5BrE,gBAAAA,mBAAAA,EAAAA;AACF,YAAA;AACF,QAAA;AAEAiC,QAAAA,mBAAAA,CAAoBzB,OAAO,GAAG0D,WAAAA;IAChC,CAAA,EAAG;AAACtE,QAAAA,QAAAA,CAASoE,QAAQ;AAAEhE,QAAAA;AAAoB,KAAA,CAAA;AAE3C+B,IAAAA,gBAAAA,CAAMgC,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAAC5C,UAAAA,EAAY;YACfV,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,MAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;AAAEwC,oBAAAA,EAAAA,EAAIW,eAAAA,CAAQ,uCAAA;AAAyC,iBAAA;AAChF,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACrD,QAAAA,UAAAA;AAAYV,QAAAA,kBAAAA;AAAoBY,QAAAA;AAAc,KAAA,CAAA;AAElD,IAAA,MAAMoD,sDAAsD,CAACvE,UAAAA,GAAAA;AAC3D,QAAA,MAAMwE,mBAAmBC,yEAAAA,CAAqCzE,UAAAA,CAAAA;QAE9D,OAAOwE,gBAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,yBAAyB,CAAC1E,UAAAA,GAAAA;AAC9B,QAAA,MAAM2E,iBAAiBC,iDAAAA,CAAyB5E,UAAAA,CAAAA;QAEhD,OAAO2E,cAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,iBAAAA,GAAoB,UAAA;QACxB,MAAMtD,kBAAAA,EAAAA;AACR,IAAA,CAAA;AAEA,IAAA,MAAMuD,UAAAA,GAAa,UAAA;QACjBlD,WAAAA,CAAY,IAAA,CAAA;QAEZ,MAAMmD,WAAAA,GAAc/D,QAAQgE,IAAAA,EAAMC,KAAAA;AAElC,QAAA,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACzG,MAAM2B,OAAO,CAACL,YAAY,CAAA,CAAEoF,MAAM,CAClE,CAACC,GAAAA,EAAK,CAACC,KAAKnC,WAAAA,CAAY,GAAA;YACtBkC,GAAG,CAACC,IAAI,GAAGR,WAAAA,CAAYS,uBAAuB,CAC5CpC,WAAAA,EACAhD,mBAAmB,CAACmF,GAAAA,CAAI,CAAA;YAG1B,OAAOD,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAGH,QAAA,MAAM,EAAEG,WAAW,EAAEC,uBAAuB,EAAE,GAAGC,4BAAAA,CAAmB;YAClE3F,UAAAA,EAAYrB,KAAAA,CAAM2B,OAAO,CAACN,UAAU;YACpCC,YAAAA,EAAciF;AAChB,SAAA,CAAA;;AAGA7D,QAAAA,UAAAA,CAAW,qBAAA,EAAuB;AAChC,YAAA,GAAGqE,uBAAuB;AAC1B7F,YAAAA;AACF,SAAA,CAAA;QAEA,MAAM+F,qBAAAA,GAAwBT,MAAAA,CAAOU,IAAI,CAAClH,KAAAA,CAAM2B,OAAO,CAACL,YAAY,CAAA,CAAE6F,MAAM,GAAG,CAAA;AAE/ErF,QAAAA,qBAAAA,EAAAA;QAEA,IAAI;AACF,YAAA,MAAM2B,YAAY2D,IAAI,CAAC,CAAC,mCAAmC,CAAC,EAAE;gBAAEjD,IAAAA,EAAM2C;AAAY,aAAA,CAAA;AAElF,YAAA,IAAIG,qBAAAA,EAAuB;;gBAEzBvE,UAAAA,CAAW,mCAAA,CAAA;AACb,YAAA;;YAGA,MAAMT,oBAAAA,EAAAA;;AAENd,YAAAA,mBAAAA,EAAAA;;AAEA,YAAA,MAAMyC,WAAWjC,OAAO,EAAA;;YAExB,MAAMuE,iBAAAA,EAAAA;;YAENzF,QAAAA,CAASN,oCAAAA,EAAAA,CAAAA;AACX,QAAA,CAAA,CAAE,OAAOwE,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB/C,kBAAAA,CAAmB;gBACjBkD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASvC,aAAAA,CAAc;oBAAEwC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AAEAvC,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGqE,uBAAuB;gBAC1BM,OAAAA,EAAS,KAAA;AACTnG,gBAAAA;AACF,aAAA,CAAA;QACF,CAAA,QAAU;YACR+B,WAAAA,CAAY,KAAA,CAAA;AACZlB,YAAAA,uBAAAA,EAAAA;AAEAtB,YAAAA,QAAAA,CAASL,oBAAAA,CAASC,IAAI,CAACC,cAAc,CAAC;AAAC,gBAAA,gBAAA;AAAkB,gBAAA;AAAwB,aAAA,CAAA,CAAA;YACjFM,kBAAAA,CAAmB;gBACjBkE,IAAAA,EAAM,uBAAA;gBACNwC,OAAAA,EAAS;oBAACC,wCAAAA,CAA6BC,kBAAkB,CAACC;AAAa;AACzE,aAAA,CAAA;AAEA/E,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGqE,uBAAuB;gBAC1BM,OAAAA,EAAS,IAAA;AACTnG,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,MAAMwG,iDAAAA,GAAoDxE,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AACtE,QAAA,OAAOqC,mDAAAA,CAAoDvE,UAAAA,CAAAA;IAC7D,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMsG,gBAAAA,GAAmBzE,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AACrC,QAAA,OAAOwC,sBAAAA,CAAuB1E,UAAAA,CAAAA;IAChC,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMuG,uBAAAA,GAA0B1E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAC5C,QAAA,OAAOsE,sEAAmCxG,UAAAA,EAAY;AAAC,YAAA;AAAW,SAAA,CAAA;IACpE,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMyG,2BAAAA,GAA8B5E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAChD,QAAA,OAAOwE,QAAQ1G,UAAAA,EAAY,UAAA,CAAA;IAC7B,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAM2G,sBAAAA,GAAyB9E,gBAAAA,CAAMK,OAAO,CAAC,IAAA;AAC3C,QAAA,OAAO0E,yBAAAA,CAAgB3G,YAAAA,CAAAA;IACzB,CAAA,EAAG;AAACA,QAAAA;AAAa,KAAA,CAAA;AAEjB,IAAA,MAAM4G,OAAAA,GAAmC;AACvCR,QAAAA,iDAAAA;AACAC,QAAAA,gBAAAA;AACAxB,QAAAA,UAAAA;AACA5E,QAAAA,aAAAA;AACAF,QAAAA,UAAAA;AACAC,QAAAA,YAAAA;AACAE,QAAAA,iBAAAA;AACAC,QAAAA,mBAAAA;AACAuB,QAAAA,QAAAA;AACAM,QAAAA,UAAAA;AACAK,QAAAA,mBAAAA;AACAiE,QAAAA,uBAAAA;AACAE,QAAAA,2BAAAA;AACAE,QAAAA,sBAAAA;AACAtG,QAAAA,SAAAA;AACAyG,QAAAA,YAAAA,CAAAA,CAAab,OAAO,EAAA;YAClB7G,QAAAA,CAAS2D,eAAAA,CAAQ+D,YAAY,CAACb,OAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AACAc,QAAAA,aAAAA,CAAAA,CAAcd,OAAO,EAAA;YACnB7G,QAAAA,CAAS2D,eAAAA,CAAQgE,aAAa,CAACd,OAAAA,CAAAA,CAAAA;AACjC,QAAA,CAAA;AACAe,QAAAA,uBAAAA,CAAAA,CAAwBf,OAAO,EAAA;YAC7B7G,QAAAA,CAAS2D,eAAAA,CAAQiE,uBAAuB,CAACf,OAAAA,CAAAA,CAAAA;AAC3C,QAAA,CAAA;AACAgB,QAAAA,wBAAAA,CAAAA,CAAyBhB,OAAO,EAAA;YAC9B7G,QAAAA,CAAS2D,eAAAA,CAAQkE,wBAAwB,CAAChB,OAAAA,CAAAA,CAAAA;AAC5C,QAAA,CAAA;AACAiB,QAAAA,gCAAAA,CAAAA,CAAiCjB,OAAO,EAAA;YACtC7G,QAAAA,CAAS2D,eAAAA,CAAQmE,gCAAgC,CAACjB,OAAAA,CAAAA,CAAAA;AACpD,QAAA,CAAA;AACAG,QAAAA,YAAAA,CAAAA,CAAaH,OAAO,EAAA;YAClB7G,QAAAA,CAAS2D,eAAAA,CAAQqD,YAAY,CAACH,OAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AACAkB,QAAAA,qBAAAA,CAAAA,CAAsB,EAAErE,IAAI,EAAEyC,GAAG,EAAE6B,iBAAiB,EAAE,EAAA;YACpDhI,QAAAA,CAAS2D,eAAAA,CAAQoE,qBAAqB,CAAC;AAAErE,gBAAAA,IAAAA;AAAMyC,gBAAAA,GAAAA;AAAK6B,gBAAAA;AAAkB,aAAA,CAAA,CAAA;AACxE,QAAA,CAAA;QACAC,2BAAAA,CAAAA,CAA4B,EAAEC,SAAS,EAAEC,SAAS,EAAEC,iBAAiB,EAAEC,aAAa,EAAE,EAAA;YACpFrI,QAAAA,CACE2D,eAAAA,CAAQsE,2BAA2B,CAAC;AAClCC,gBAAAA,SAAAA;AACAC,gBAAAA,SAAAA;AACAC,gBAAAA,iBAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAC,QAAAA,eAAAA,CAAAA,CAAgBzB,OAAO,EAAA;YACrB,IAAIA,OAAAA,CAAQqB,SAAS,KAAK,aAAA,EAAe;;gBAEvCjG,UAAAA,CAAW,8BAAA,CAAA;AACb,YAAA;YAEAjC,QAAAA,CAAS2D,eAAAA,CAAQ4E,WAAW,CAAC1B,OAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;AACA2B,QAAAA,8BAAAA,CAAAA,CAA+B3B,OAAO,EAAA;YACpC7G,QAAAA,CAAS2D,eAAAA,CAAQ6E,8BAA8B,CAAC3B,OAAAA,CAAAA,CAAAA;AAClD,QAAA,CAAA;AACA4B,QAAAA,eAAAA,CAAAA,CAAgBtC,GAA2B,EAAA;AACzC,YAAA,MAAMuC,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC7G,aAAAA,CAAc;gBACZwC,EAAAA,EAAIW,eAAAA,CAAQ,CAAC,yCAAyC,CAAC;AACzD,aAAA,CAAA,CAAA;AAGF,YAAA,IAAIwD,WAAAA,EAAa;AACfrG,gBAAAA,YAAAA,EAAAA;gBAEArC,QAAAA,CAAS2D,eAAAA,CAAQ8E,eAAe,CAACtC,GAAAA,CAAAA,CAAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA0C,QAAAA,iBAAAA,CAAAA,CAAkB1C,GAA6B,EAAA;AAC7C,YAAA,MAAMuC,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC7G,aAAAA,CAAc;gBACZwC,EAAAA,EAAIW,eAAAA,CAAQ,CAAC,2CAA2C,CAAC;AAC3D,aAAA,CAAA,CAAA;AAGF,YAAA,IAAIwD,WAAAA,EAAa;AACfrG,gBAAAA,YAAAA,EAAAA;gBAEArC,QAAAA,CAAS2D,eAAAA,CAAQkF,iBAAiB,CAAC1C,GAAAA,CAAAA,CAAAA;AACrC,YAAA;AACF,QAAA,CAAA;AAEA2C,QAAAA,qBAAAA,CAAAA,CAAsB,EAAEpF,IAAI,EAAEqF,YAAY,EAAE,EAAA;YAC1C/I,QAAAA,CACE2D,eAAAA,CAAQmF,qBAAqB,CAAC;AAC5BpF,gBAAAA,IAAAA;gBACAyC,GAAAA,EAAK4C;AACP,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,kBAAAA,CAAAA,CAAmB,EAAED,YAAY,EAAEE,eAAe,EAAE,EAAA;YAClDjJ,QAAAA,CACE2D,eAAAA,CAAQqF,kBAAkB,CAAC;gBACzB7C,GAAAA,EAAK4C,YAAAA;AACLE,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,YAAAA,CAAAA,CAAaC,IAAI,EAAA;YACfnJ,QAAAA,CAAS2D,eAAAA,CAAQuF,YAAY,CAACC,IAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAC,QAAAA,aAAAA,CAAAA,CAAcD,IAAI,EAAA;YAChBnJ,QAAAA,CAAS2D,eAAAA,CAAQyF,aAAa,CAACD,IAAAA,CAAAA,CAAAA;AACjC,QAAA,CAAA;AAEAE,QAAAA,WAAAA,CAAAA,CAAYF,IAAI,EAAA;YACdnJ,QAAAA,CAAS2D,eAAAA,CAAQ0F,WAAW,CAACF,IAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;QAEAG,OAAAA,EAAS;AACPC,YAAAA,IAAAA,CAAAA,GAAAA;AACEvJ,gBAAAA,QAAAA,CAAS2D,gBAAQ4F,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,IAAAA,CAAAA,GAAAA;AACExJ,gBAAAA,QAAAA,CAAS2D,gBAAQ6F,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,iBAAAA,CAAAA,GAAAA;AACEzJ,gBAAAA,QAAAA,CAAS2D,gBAAQ+F,UAAU,EAAA,CAAA;AAC7B,YAAA,CAAA;AAEAC,YAAAA,OAAAA,EAASpK,KAAAA,CAAMqK,IAAI,CAAClD,MAAM,GAAG,CAAA;AAC7BmD,YAAAA,OAAAA,EAAStK,KAAAA,CAAMuK,MAAM,CAACpD,MAAM,GAAG,CAAA;YAC/BqD,aAAAA,EAAelH;AACjB;AACF,KAAA;IAEA,qBAAOmH,cAAA,CAACC,sCAAmBC,QAAQ,EAAA;QAACC,KAAAA,EAAO1C,OAAAA;AAAU1H,QAAAA,QAAAA,EAAAA;;AACvD;;;;"}
@@ -22,6 +22,20 @@ import { retrieveNestedComponents } from './utils/retrieveNestedComponents.mjs';
22
22
  import { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents.mjs';
23
23
 
24
24
  const selectState = (state)=>state['content-type-builder_dataManagerProvider'] || initialState;
25
+ /**
26
+ * Tag types registered on the shared `adminApi` instance at runtime by
27
+ * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`
28
+ * (see packages/core/content-manager/admin/src/services/api.ts).
29
+ *
30
+ * The cast is only required because adminApi's compile-time tag union doesn't see
31
+ * tags added downstream from this side of the dependency graph.
32
+ */ const CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [
33
+ 'InitialData',
34
+ 'ContentTypesConfiguration',
35
+ 'ContentTypeSettings',
36
+ 'ComponentConfiguration'
37
+ ];
38
+ const invalidateContentManagerSchemaCaches = ()=>adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS);
25
39
  const DataManagerProvider = ({ children })=>{
26
40
  const dispatch = useDispatch();
27
41
  const state = useSelector(selectState);
@@ -51,7 +65,7 @@ const DataManagerProvider = ({ children })=>{
51
65
  ]);
52
66
  const fetchClient = useFetchClient();
53
67
  const isInDevelopmentMode = autoReload;
54
- const getDataRef = React.useRef();
68
+ const getDataRef = React.useRef(async ()=>undefined);
55
69
  getDataRef.current = async ()=>{
56
70
  try {
57
71
  const [schemaResponse, reservedNamesResponse] = await Promise.all([
@@ -170,6 +184,8 @@ const DataManagerProvider = ({ children })=>{
170
184
  await getDataRef.current();
171
185
  // Update the app's permissions
172
186
  await updatePermissions();
187
+ // Refresh content-manager caches that depend on the CT/component schema.
188
+ dispatch(invalidateContentManagerSchemaCaches());
173
189
  } catch (err) {
174
190
  console.error({
175
191
  err
@@ -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 { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\n\nimport type { ContentTypes, ContentType, Components } from '../../types';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\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 isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(isEqual(components, initialComponents) && isEqual(contentTypes, initialContentTypes));\n }, [components, contentTypes, initialComponents, initialContentTypes]);\n\n const fetchClient = useFetchClient();\n\n const isInDevelopmentMode = autoReload;\n\n const getDataRef = React.useRef<any>();\n\n getDataRef.current = async () => {\n try {\n const [schemaResponse, reservedNamesResponse] = await Promise.all([\n fetchClient.get(`/content-type-builder/schema`),\n fetchClient.get(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes } = schemaResponse.data.data;\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n });\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n // Update the app's permissions\n await updatePermissions();\n } 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 isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n addAttribute(payload) {\n dispatch(actions.addAttribute(payload));\n },\n editAttribute(payload) {\n dispatch(actions.editAttribute(payload));\n },\n addCustomFieldAttribute(payload) {\n dispatch(actions.addCustomFieldAttribute(payload));\n },\n editCustomFieldAttribute(payload) {\n dispatch(actions.editCustomFieldAttribute(payload));\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n dispatch(actions.createSchema(payload));\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 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 dispatch(actions.updateSchema(args));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n applyChange(args) {\n dispatch(actions.applyChange(args));\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return <DataManagerContext.Provider value={context}>{children}</DataManagerContext.Provider>;\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["selectState","state","initialState","DataManagerProvider","children","dispatch","useDispatch","useSelector","dispatchGuidedTour","useGuidedTour","s","location","useLocation","sessionId","ctbSessionId","regenerateSessionId","useCTBSession","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","isSendingContentTypes","keys","length","post","success","adminApi","util","invalidateTags","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createComponentSchema","componentCategory","changeDynamicZoneComponents","forTarget","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsx","DataManagerContext","Provider","value"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAMA,cAAc,CAACC,KAAAA,GAClBA,KAAK,CAAC,2CAA2C,IAAIC,YAAAA;AAExD,MAAMC,mBAAAA,GAAsB,CAAC,EAAEC,QAAQ,EAA4B,GAAA;AACjE,IAAA,MAAMC,QAAAA,GAAWC,WAAAA,EAAAA;AACjB,IAAA,MAAML,QAAQM,WAAAA,CAAYP,WAAAA,CAAAA;AAC1B,IAAA,MAAMQ,qBAAqBC,aAAAA,CAAc,qBAAA,EAAuB,CAACC,CAAAA,GAAMA,EAAEL,QAAQ,CAAA;AACjF,IAAA,MAAMM,QAAAA,GAAWC,WAAAA,EAAAA;AACjB,IAAA,MAAM,EAAEC,SAAAA,EAAWC,YAAY,EAAEC,mBAAmB,EAAE,GAAGC,aAAAA,EAAAA;AAEzD,IAAA,MAAM,EACJC,UAAU,EACVC,YAAY,EACZC,aAAa,EACbC,iBAAiB,EACjBC,mBAAmB,EACnBC,SAAS,EACV,GAAGrB,MAAMsB,OAAO;IAEjB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,EAAEC,qBAAqB,EAAEC,uBAAuB,EAAE,GAAGC,2BAAAA,EAAAA;AAC3D,IAAA,MAAMC,oBAAAA,GAAuBC,uBAAAA,EAAAA;AAE7B,IAAA,MAAMC,YAAYC,YAAAA,CAAa,qBAAA,EAAuB,CAAC/B,KAAAA,GAAUA,MAAM8B,SAAS,CAAA;AAChF,IAAA,MAAME,SAASF,SAAAA,CAAU,sBAAA,CAAA;AACzB,IAAA,MAAMG,aAAaC,UAAAA,CAAW,qBAAA,EAAuB,CAAClC,KAAAA,GAAUA,MAAMiC,UAAU,CAAA;IAChF,MAAM,EAAEE,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,cAAAA,EAAAA;AACvB,IAAA,MAAMC,qBAAqBC,OAAAA,CAAQ,qBAAA,EAAuB,CAACxC,KAAAA,GAAUA,MAAMuC,kBAAkB,CAAA;IAC7F,MAAM,EAAEE,YAAY,EAAE,GAAGC,sBAAAA,EAAAA;AAEzB,IAAA,MAAM,CAACC,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IAC/C,MAAMC,mBAAAA,GAAsBF,KAAAA,CAAMG,MAAM,CAAgB,IAAA,CAAA;IAExD,MAAMC,UAAAA,GAAaJ,KAAAA,CAAMK,OAAO,CAAC,IAAA;AAC/B,QAAA,OAAO,EAAEC,OAAAA,CAAQnC,YAAYG,iBAAAA,CAAAA,IAAsBgC,OAAAA,CAAQlC,cAAcG,mBAAAA,CAAmB,CAAA;IAC9F,CAAA,EAAG;AAACJ,QAAAA,UAAAA;AAAYC,QAAAA,YAAAA;AAAcE,QAAAA,iBAAAA;AAAmBC,QAAAA;AAAoB,KAAA,CAAA;AAErE,IAAA,MAAMgC,WAAAA,GAAcC,cAAAA,EAAAA;AAEpB,IAAA,MAAMC,mBAAAA,GAAsBrB,UAAAA;IAE5B,MAAMsB,UAAAA,GAAaV,MAAMG,MAAM,EAAA;AAE/BO,IAAAA,UAAAA,CAAWjC,OAAO,GAAG,UAAA;QACnB,IAAI;AACF,YAAA,MAAM,CAACkC,cAAAA,EAAgBC,qBAAAA,CAAsB,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AAChEP,gBAAAA,WAAAA,CAAYQ,GAAG,CAAC,CAAC,4BAA4B,CAAC,CAAA;AAC9CR,gBAAAA,WAAAA,CAAYQ,GAAG,CAAC,CAAC,oCAAoC,CAAC;AACvD,aAAA,CAAA;YAED,MAAM,EAAE5C,UAAU,EAAEC,YAAY,EAAE,GAAGuC,cAAAA,CAAeK,IAAI,CAACA,IAAI;YAE7DzD,QAAAA,CACE0D,OAAAA,CAAQC,IAAI,CAAC;AACX/C,gBAAAA,UAAAA,EAAYgD,SAAAA,CAAUhD,UAAAA,EAAY,CAACiD,SAAAA,IAAe;AAChD,wBAAA,GAAGA,SAAS;wBACZC,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAjD,gBAAAA,YAAAA,EAAc+C,SAAAA,CAAU/C,YAAAA,EAAc,CAACkD,WAAAA,IAAiB;AACtD,wBAAA,GAAGA,WAAW;wBACdD,MAAAA,EAAQ;qBACV,CAAA,CAAA;AACAhD,gBAAAA,aAAAA,EAAeuC,sBAAsBI;AACvC,aAAA,CAAA,CAAA;AAGFzD,YAAAA,QAAAA,CAAS0D,QAAQM,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA,CAAE,OAAOC,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB9C,kBAAAA,CAAmB;gBACjBiD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAStC,aAAAA,CAAc;oBAAEuC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;AAEA9B,IAAAA,KAAAA,CAAM+B,SAAS,CAAC,IAAA;AACdrB,QAAAA,UAAAA,CAAWjC,OAAO,EAAA;QAClByB,mBAAAA,CAAoBzB,OAAO,GAAGZ,QAAAA,CAASmE,QAAQ;QAE/C,OAAO,IAAA;;AAELzE,YAAAA,QAAAA,CAAS0D,QAAQgB,YAAY,EAAA,CAAA;AAC/B,QAAA,CAAA;;AAEF,IAAA,CAAA,EAAG,EAAE,CAAA;;AAGLjC,IAAAA,KAAAA,CAAM+B,SAAS,CAAC,IAAA;QACd,MAAMG,WAAAA,GAAcrE,SAASmE,QAAQ;QACrC,MAAMG,YAAAA,GAAejC,oBAAoBzB,OAAO;AAChD,QAAA,MAAM2D,QAAAA,GAAW,+BAAA;AAEjB,QAAA,IAAID,YAAAA,EAAc;YAChB,MAAME,SAAAA,GAAYH,WAAAA,CAAYI,QAAQ,CAACF,QAAAA,CAAAA;YACvC,MAAMG,UAAAA,GAAaJ,YAAAA,CAAaG,QAAQ,CAACF,QAAAA,CAAAA;;YAGzC,IAAI,CAACG,cAAcF,SAAAA,EAAW;AAC5BpE,gBAAAA,mBAAAA,EAAAA;AACF,YAAA;AACF,QAAA;AAEAiC,QAAAA,mBAAAA,CAAoBzB,OAAO,GAAGyD,WAAAA;IAChC,CAAA,EAAG;AAACrE,QAAAA,QAAAA,CAASmE,QAAQ;AAAE/D,QAAAA;AAAoB,KAAA,CAAA;AAE3C+B,IAAAA,KAAAA,CAAM+B,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAAC3C,UAAAA,EAAY;YACfV,kBAAAA,CAAmB;gBACjBiD,IAAAA,EAAM,MAAA;AACNC,gBAAAA,OAAAA,EAAStC,aAAAA,CAAc;AAAEuC,oBAAAA,EAAAA,EAAIW,OAAAA,CAAQ,uCAAA;AAAyC,iBAAA;AAChF,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACpD,QAAAA,UAAAA;AAAYV,QAAAA,kBAAAA;AAAoBY,QAAAA;AAAc,KAAA,CAAA;AAElD,IAAA,MAAMmD,sDAAsD,CAACtE,UAAAA,GAAAA;AAC3D,QAAA,MAAMuE,mBAAmBC,oCAAAA,CAAqCxE,UAAAA,CAAAA;QAE9D,OAAOuE,gBAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,yBAAyB,CAACzE,UAAAA,GAAAA;AAC9B,QAAA,MAAM0E,iBAAiBC,wBAAAA,CAAyB3E,UAAAA,CAAAA;QAEhD,OAAO0E,cAAAA;AACT,IAAA,CAAA;AAEA,IAAA,MAAME,iBAAAA,GAAoB,UAAA;QACxB,MAAMrD,kBAAAA,EAAAA;AACR,IAAA,CAAA;AAEA,IAAA,MAAMsD,UAAAA,GAAa,UAAA;QACjBjD,WAAAA,CAAY,IAAA,CAAA;QAEZ,MAAMkD,WAAAA,GAAc9D,QAAQ+D,IAAAA,EAAMC,KAAAA;AAElC,QAAA,MAAMC,UAAAA,GAAaC,MAAAA,CAAOC,OAAO,CAACnG,MAAMsB,OAAO,CAACL,YAAY,CAAA,CAAEmF,MAAM,CAClE,CAACC,GAAAA,EAAK,CAACC,KAAKnC,WAAAA,CAAY,GAAA;YACtBkC,GAAG,CAACC,IAAI,GAAGR,WAAAA,CAAYS,uBAAuB,CAC5CpC,WAAAA,EACA/C,mBAAmB,CAACkF,GAAAA,CAAI,CAAA;YAG1B,OAAOD,GAAAA;AACT,QAAA,CAAA,EACA,EAAC,CAAA;AAGH,QAAA,MAAM,EAAEG,WAAW,EAAEC,uBAAuB,EAAE,GAAGC,kBAAAA,CAAmB;YAClE1F,UAAAA,EAAYhB,KAAAA,CAAMsB,OAAO,CAACN,UAAU;YACpCC,YAAAA,EAAcgF;AAChB,SAAA,CAAA;;AAGA5D,QAAAA,UAAAA,CAAW,qBAAA,EAAuB;AAChC,YAAA,GAAGoE,uBAAuB;AAC1B5F,YAAAA;AACF,SAAA,CAAA;QAEA,MAAM8F,qBAAAA,GAAwBT,MAAAA,CAAOU,IAAI,CAAC5G,KAAAA,CAAMsB,OAAO,CAACL,YAAY,CAAA,CAAE4F,MAAM,GAAG,CAAA;AAE/EpF,QAAAA,qBAAAA,EAAAA;QAEA,IAAI;AACF,YAAA,MAAM2B,YAAY0D,IAAI,CAAC,CAAC,mCAAmC,CAAC,EAAE;gBAAEjD,IAAAA,EAAM2C;AAAY,aAAA,CAAA;AAElF,YAAA,IAAIG,qBAAAA,EAAuB;;gBAEzBtE,UAAAA,CAAW,mCAAA,CAAA;AACb,YAAA;;YAGA,MAAMT,oBAAAA,EAAAA;;AAENd,YAAAA,mBAAAA,EAAAA;;AAEA,YAAA,MAAMyC,WAAWjC,OAAO,EAAA;;YAExB,MAAMsE,iBAAAA,EAAAA;AACR,QAAA,CAAA,CAAE,OAAOvB,GAAAA,EAAK;AACZC,YAAAA,OAAAA,CAAQC,KAAK,CAAC;AAAEF,gBAAAA;AAAI,aAAA,CAAA;YACpB9C,kBAAAA,CAAmB;gBACjBiD,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAStC,aAAAA,CAAc;oBAAEuC,EAAAA,EAAI,oBAAA;oBAAsBC,cAAAA,EAAgB;AAAoB,iBAAA;AACzF,aAAA,CAAA;AAEAtC,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGoE,uBAAuB;gBAC1BM,OAAAA,EAAS,KAAA;AACTlG,gBAAAA;AACF,aAAA,CAAA;QACF,CAAA,QAAU;YACR+B,WAAAA,CAAY,KAAA,CAAA;AACZlB,YAAAA,uBAAAA,EAAAA;AAEAtB,YAAAA,QAAAA,CAAS4G,QAAAA,CAASC,IAAI,CAACC,cAAc,CAAC;AAAC,gBAAA,gBAAA;AAAkB,gBAAA;AAAwB,aAAA,CAAA,CAAA;YACjF3G,kBAAAA,CAAmB;gBACjBiE,IAAAA,EAAM,uBAAA;gBACN2C,OAAAA,EAAS;oBAACC,4BAAAA,CAA6BC,kBAAkB,CAACC;AAAa;AACzE,aAAA,CAAA;AAEAjF,YAAAA,UAAAA,CAAW,oBAAA,EAAsB;AAC/B,gBAAA,GAAGoE,uBAAuB;gBAC1BM,OAAAA,EAAS,IAAA;AACTlG,gBAAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,MAAM0G,iDAAAA,GAAoD1E,KAAAA,CAAMK,OAAO,CAAC,IAAA;AACtE,QAAA,OAAOoC,mDAAAA,CAAoDtE,UAAAA,CAAAA;IAC7D,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMwG,gBAAAA,GAAmB3E,KAAAA,CAAMK,OAAO,CAAC,IAAA;AACrC,QAAA,OAAOuC,sBAAAA,CAAuBzE,UAAAA,CAAAA;IAChC,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAMyG,uBAAAA,GAA0B5E,KAAAA,CAAMK,OAAO,CAAC,IAAA;AAC5C,QAAA,OAAOwE,mCAAmC1G,UAAAA,EAAY;AAAC,YAAA;AAAW,SAAA,CAAA;IACpE,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAM2G,2BAAAA,GAA8B9E,KAAAA,CAAMK,OAAO,CAAC,IAAA;AAChD,QAAA,OAAO0E,QAAQ5G,UAAAA,EAAY,UAAA,CAAA;IAC7B,CAAA,EAAG;AAACA,QAAAA;AAAW,KAAA,CAAA;IAEf,MAAM6G,sBAAAA,GAAyBhF,KAAAA,CAAMK,OAAO,CAAC,IAAA;AAC3C,QAAA,OAAO4E,eAAAA,CAAgB7G,YAAAA,CAAAA;IACzB,CAAA,EAAG;AAACA,QAAAA;AAAa,KAAA,CAAA;AAEjB,IAAA,MAAM8G,OAAAA,GAAmC;AACvCR,QAAAA,iDAAAA;AACAC,QAAAA,gBAAAA;AACA3B,QAAAA,UAAAA;AACA3E,QAAAA,aAAAA;AACAF,QAAAA,UAAAA;AACAC,QAAAA,YAAAA;AACAE,QAAAA,iBAAAA;AACAC,QAAAA,mBAAAA;AACAuB,QAAAA,QAAAA;AACAM,QAAAA,UAAAA;AACAK,QAAAA,mBAAAA;AACAmE,QAAAA,uBAAAA;AACAE,QAAAA,2BAAAA;AACAE,QAAAA,sBAAAA;AACAxG,QAAAA,SAAAA;AACA2G,QAAAA,YAAAA,CAAAA,CAAab,OAAO,EAAA;YAClB/G,QAAAA,CAAS0D,OAAAA,CAAQkE,YAAY,CAACb,OAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AACAc,QAAAA,aAAAA,CAAAA,CAAcd,OAAO,EAAA;YACnB/G,QAAAA,CAAS0D,OAAAA,CAAQmE,aAAa,CAACd,OAAAA,CAAAA,CAAAA;AACjC,QAAA,CAAA;AACAe,QAAAA,uBAAAA,CAAAA,CAAwBf,OAAO,EAAA;YAC7B/G,QAAAA,CAAS0D,OAAAA,CAAQoE,uBAAuB,CAACf,OAAAA,CAAAA,CAAAA;AAC3C,QAAA,CAAA;AACAgB,QAAAA,wBAAAA,CAAAA,CAAyBhB,OAAO,EAAA;YAC9B/G,QAAAA,CAAS0D,OAAAA,CAAQqE,wBAAwB,CAAChB,OAAAA,CAAAA,CAAAA;AAC5C,QAAA,CAAA;AACAiB,QAAAA,gCAAAA,CAAAA,CAAiCjB,OAAO,EAAA;YACtC/G,QAAAA,CAAS0D,OAAAA,CAAQsE,gCAAgC,CAACjB,OAAAA,CAAAA,CAAAA;AACpD,QAAA,CAAA;AACAG,QAAAA,YAAAA,CAAAA,CAAaH,OAAO,EAAA;YAClB/G,QAAAA,CAAS0D,OAAAA,CAAQwD,YAAY,CAACH,OAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AACAkB,QAAAA,qBAAAA,CAAAA,CAAsB,EAAExE,IAAI,EAAEyC,GAAG,EAAEgC,iBAAiB,EAAE,EAAA;YACpDlI,QAAAA,CAAS0D,OAAAA,CAAQuE,qBAAqB,CAAC;AAAExE,gBAAAA,IAAAA;AAAMyC,gBAAAA,GAAAA;AAAKgC,gBAAAA;AAAkB,aAAA,CAAA,CAAA;AACxE,QAAA,CAAA;QACAC,2BAAAA,CAAAA,CAA4B,EAAEC,SAAS,EAAEC,SAAS,EAAEC,iBAAiB,EAAEC,aAAa,EAAE,EAAA;YACpFvI,QAAAA,CACE0D,OAAAA,CAAQyE,2BAA2B,CAAC;AAClCC,gBAAAA,SAAAA;AACAC,gBAAAA,SAAAA;AACAC,gBAAAA,iBAAAA;AACAC,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AACAC,QAAAA,eAAAA,CAAAA,CAAgBzB,OAAO,EAAA;YACrB,IAAIA,OAAAA,CAAQqB,SAAS,KAAK,aAAA,EAAe;;gBAEvCnG,UAAAA,CAAW,8BAAA,CAAA;AACb,YAAA;YAEAjC,QAAAA,CAAS0D,OAAAA,CAAQ+E,WAAW,CAAC1B,OAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;AACA2B,QAAAA,8BAAAA,CAAAA,CAA+B3B,OAAO,EAAA;YACpC/G,QAAAA,CAAS0D,OAAAA,CAAQgF,8BAA8B,CAAC3B,OAAAA,CAAAA,CAAAA;AAClD,QAAA,CAAA;AACA4B,QAAAA,eAAAA,CAAAA,CAAgBzC,GAA2B,EAAA;AACzC,YAAA,MAAM0C,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC/G,aAAAA,CAAc;gBACZuC,EAAAA,EAAIW,OAAAA,CAAQ,CAAC,yCAAyC,CAAC;AACzD,aAAA,CAAA,CAAA;AAGF,YAAA,IAAI2D,WAAAA,EAAa;AACfvG,gBAAAA,YAAAA,EAAAA;gBAEArC,QAAAA,CAAS0D,OAAAA,CAAQiF,eAAe,CAACzC,GAAAA,CAAAA,CAAAA;AACnC,YAAA;AACF,QAAA,CAAA;AACA6C,QAAAA,iBAAAA,CAAAA,CAAkB7C,GAA6B,EAAA;AAC7C,YAAA,MAAM0C,WAAAA,GAAcC,MAAAA,CAAOC,OAAO,CAChC/G,aAAAA,CAAc;gBACZuC,EAAAA,EAAIW,OAAAA,CAAQ,CAAC,2CAA2C,CAAC;AAC3D,aAAA,CAAA,CAAA;AAGF,YAAA,IAAI2D,WAAAA,EAAa;AACfvG,gBAAAA,YAAAA,EAAAA;gBAEArC,QAAAA,CAAS0D,OAAAA,CAAQqF,iBAAiB,CAAC7C,GAAAA,CAAAA,CAAAA;AACrC,YAAA;AACF,QAAA,CAAA;AAEA8C,QAAAA,qBAAAA,CAAAA,CAAsB,EAAEvF,IAAI,EAAEwF,YAAY,EAAE,EAAA;YAC1CjJ,QAAAA,CACE0D,OAAAA,CAAQsF,qBAAqB,CAAC;AAC5BvF,gBAAAA,IAAAA;gBACAyC,GAAAA,EAAK+C;AACP,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,kBAAAA,CAAAA,CAAmB,EAAED,YAAY,EAAEE,eAAe,EAAE,EAAA;YAClDnJ,QAAAA,CACE0D,OAAAA,CAAQwF,kBAAkB,CAAC;gBACzBhD,GAAAA,EAAK+C,YAAAA;AACLE,gBAAAA;AACF,aAAA,CAAA,CAAA;AAEJ,QAAA,CAAA;AAEAC,QAAAA,YAAAA,CAAAA,CAAaC,IAAI,EAAA;YACfrJ,QAAAA,CAAS0D,OAAAA,CAAQ0F,YAAY,CAACC,IAAAA,CAAAA,CAAAA;AAChC,QAAA,CAAA;AAEAC,QAAAA,aAAAA,CAAAA,CAAcD,IAAI,EAAA;YAChBrJ,QAAAA,CAAS0D,OAAAA,CAAQ4F,aAAa,CAACD,IAAAA,CAAAA,CAAAA;AACjC,QAAA,CAAA;AAEAE,QAAAA,WAAAA,CAAAA,CAAYF,IAAI,EAAA;YACdrJ,QAAAA,CAAS0D,OAAAA,CAAQ6F,WAAW,CAACF,IAAAA,CAAAA,CAAAA;AAC/B,QAAA,CAAA;QAEAG,OAAAA,EAAS;AACPC,YAAAA,IAAAA,CAAAA,GAAAA;AACEzJ,gBAAAA,QAAAA,CAAS0D,QAAQ+F,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,IAAAA,CAAAA,GAAAA;AACE1J,gBAAAA,QAAAA,CAAS0D,QAAQgG,IAAI,EAAA,CAAA;AACvB,YAAA,CAAA;AAEAC,YAAAA,iBAAAA,CAAAA,GAAAA;AACE3J,gBAAAA,QAAAA,CAAS0D,QAAQkG,UAAU,EAAA,CAAA;AAC7B,YAAA,CAAA;AAEAC,YAAAA,OAAAA,EAASjK,KAAAA,CAAMkK,IAAI,CAACrD,MAAM,GAAG,CAAA;AAC7BsD,YAAAA,OAAAA,EAASnK,KAAAA,CAAMoK,MAAM,CAACvD,MAAM,GAAG,CAAA;YAC/BwD,aAAAA,EAAepH;AACjB;AACF,KAAA;IAEA,qBAAOqH,GAAA,CAACC,mBAAmBC,QAAQ,EAAA;QAACC,KAAAA,EAAO1C,OAAAA;AAAU5H,QAAAA,QAAAA,EAAAA;;AACvD;;;;"}
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 { useIntl } from 'react-intl';\nimport { useSelector, useDispatch } from 'react-redux';\nimport { useLocation } from 'react-router-dom';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\nimport { useCTBTracking } from '../CTBSession/ctbSession';\nimport { useCTBSession } from '../CTBSession/useCTBSession';\nimport { useFormModalNavigation } from '../FormModalNavigation/useFormModalNavigation';\n\nimport { DataManagerContext, type DataManagerContextValue } from './DataManagerContext';\nimport { actions, initialState, type State } from './reducer';\nimport { useServerRestartWatcher } from './useServerRestartWatcher';\nimport { sortContentType, stateToRequestData } from './utils/cleanData';\nimport { retrieveComponentsThatHaveComponents } from './utils/retrieveComponentsThatHaveComponents';\nimport { retrieveNestedComponents } from './utils/retrieveNestedComponents';\nimport { retrieveSpecificInfoFromComponents } from './utils/retrieveSpecificInfoFromComponents';\n\nimport type { ContentTypes, ContentType, Components } from '../../types';\nimport type { FormAPI } from '../../utils/formAPI';\nimport type { Internal } from '@strapi/types';\n\ninterface DataManagerProviderProps {\n children: React.ReactNode;\n}\n\nconst selectState = (state: Record<string, unknown>) =>\n (state['content-type-builder_dataManagerProvider'] || initialState) as State;\n\n/**\n * Tag types registered on the shared `adminApi` instance at runtime by\n * `@strapi/content-manager` via `enhanceEndpoints({ addTagTypes: [...] })`\n * (see packages/core/content-manager/admin/src/services/api.ts).\n *\n * The cast is only required because adminApi's compile-time tag union doesn't see\n * tags added downstream from this side of the dependency graph.\n */\nconst CONTENT_MANAGER_SCHEMA_CACHE_TAGS = [\n 'InitialData',\n 'ContentTypesConfiguration',\n 'ContentTypeSettings',\n 'ComponentConfiguration',\n] as const;\n\nconst invalidateContentManagerSchemaCaches = () =>\n adminApi.util.invalidateTags(CONTENT_MANAGER_SCHEMA_CACHE_TAGS as never);\n\nconst DataManagerProvider = ({ children }: DataManagerProviderProps) => {\n const dispatch = useDispatch();\n const state = useSelector(selectState);\n const dispatchGuidedTour = useGuidedTour('DataManagerProvider', (s) => s.dispatch);\n const location = useLocation();\n const { sessionId: ctbSessionId, regenerateSessionId } = useCTBSession();\n\n const {\n components,\n contentTypes,\n reservedNames,\n initialComponents,\n initialContentTypes,\n isLoading,\n } = state.current;\n\n const { toggleNotification } = useNotification();\n const { lockAppWithAutoreload, unlockAppWithAutoreload } = useAutoReloadOverlayBlocker();\n const serverRestartWatcher = useServerRestartWatcher();\n\n const getPlugin = useStrapiApp('DataManagerProvider', (state) => state.getPlugin);\n const plugin = getPlugin('content-type-builder');\n const autoReload = useAppInfo('DataManagerProvider', (state) => state.autoReload);\n const { formatMessage } = useIntl();\n const { trackUsage } = useCTBTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\n const previousLocationRef = React.useRef<string | null>(null);\n\n const isModified = React.useMemo(() => {\n return !(isEqual(components, initialComponents) && isEqual(contentTypes, initialContentTypes));\n }, [components, contentTypes, initialComponents, initialContentTypes]);\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(`/content-type-builder/schema`),\n fetchClient.get(`/content-type-builder/reserved-names`),\n ]);\n\n const { components, contentTypes } = schemaResponse.data.data;\n\n dispatch(\n actions.init({\n components: mapValues(components, (component) => ({\n ...component,\n status: 'UNCHANGED',\n })) as Components,\n contentTypes: mapValues(contentTypes, (contentType) => ({\n ...contentType,\n status: 'UNCHANGED',\n })) as ContentTypes,\n reservedNames: reservedNamesResponse.data,\n })\n );\n\n dispatch(actions.clearHistory());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n React.useEffect(() => {\n getDataRef.current();\n previousLocationRef.current = location.pathname;\n\n return () => {\n // Reload the plugin so the cycle is new again\n dispatch(actions.reloadPlugin());\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Detect navigation away and back to CTB to regenerate session\n React.useEffect(() => {\n const currentPath = location.pathname;\n const previousPath = previousLocationRef.current;\n const CTB_PATH = '/plugins/content-type-builder';\n\n if (previousPath) {\n const isCTBPath = currentPath.includes(CTB_PATH);\n const wasCTBPath = previousPath.includes(CTB_PATH);\n\n // Regenerate session when returning to CTB after navigating away\n if (!wasCTBPath && isCTBPath) {\n regenerateSessionId();\n }\n }\n\n previousLocationRef.current = currentPath;\n }, [location.pathname, regenerateSessionId]);\n\n React.useEffect(() => {\n if (!autoReload) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('notification.info.autoreaload-disable') }),\n });\n }\n }, [autoReload, toggleNotification, formatMessage]);\n\n const getAllComponentsThatHaveAComponentInTheirAttributes = (components: Components) => {\n const composWithCompos = retrieveComponentsThatHaveComponents(components);\n\n return composWithCompos;\n };\n\n const getAllNestedComponents = (components: Components) => {\n const appNestedCompo = retrieveNestedComponents(components);\n\n return appNestedCompo;\n };\n\n const updatePermissions = async () => {\n await refetchPermissions();\n };\n\n const saveSchema = async () => {\n setIsSaving(true);\n\n const PluginForms = plugin?.apis?.forms as FormAPI;\n\n const mutatedCTs = Object.entries(state.current.contentTypes).reduce(\n (acc, [uid, contentType]) => {\n acc[uid] = PluginForms.mutateContentTypeSchema(\n contentType,\n initialContentTypes[uid]\n ) as ContentType;\n\n return acc;\n },\n {} as ContentTypes\n );\n\n const { requestData, trackingEventProperties } = stateToRequestData({\n components: state.current.components,\n contentTypes: mutatedCTs,\n });\n\n // Track that the save button was clicked (includes session ID via useCTBTracking)\n trackUsage('willUpdateCTBSchema', {\n ...trackingEventProperties,\n ctbSessionId,\n });\n\n const isSendingContentTypes = Object.keys(state.current.contentTypes).length > 0;\n\n lockAppWithAutoreload();\n\n try {\n await fetchClient.post(`/content-type-builder/update-schema`, { data: requestData });\n\n if (isSendingContentTypes) {\n // Note: didCreateGuidedTourCollectionType doesn't accept properties\n trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Generate new session ID after server restart\n regenerateSessionId();\n // refetch and update initial state after the data has been saved\n await getDataRef.current();\n // Update the app's permissions\n await updatePermissions();\n // Refresh content-manager caches that depend on the CT/component schema.\n dispatch(invalidateContentManagerSchemaCaches());\n } catch (err) {\n console.error({ err });\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: false,\n ctbSessionId,\n });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\n dispatchGuidedTour({\n type: 'set_completed_actions',\n payload: [GUIDED_TOUR_REQUIRED_ACTIONS.contentTypeBuilder.createSchema],\n });\n\n trackUsage('didUpdateCTBSchema', {\n ...trackingEventProperties,\n success: true,\n ctbSessionId,\n });\n }\n };\n\n const componentsThatHaveOtherComponentInTheirAttributes = React.useMemo(() => {\n return getAllComponentsThatHaveAComponentInTheirAttributes(components);\n }, [components]);\n\n const nestedComponents = React.useMemo(() => {\n return getAllNestedComponents(components);\n }, [components]);\n\n const allComponentsCategories = React.useMemo(() => {\n return retrieveSpecificInfoFromComponents(components, ['category']);\n }, [components]);\n\n const componentsGroupedByCategory = React.useMemo(() => {\n return groupBy(components, 'category');\n }, [components]);\n\n const sortedContentTypesList = React.useMemo(() => {\n return sortContentType(contentTypes);\n }, [contentTypes]);\n\n const context: DataManagerContextValue = {\n componentsThatHaveOtherComponentInTheirAttributes,\n nestedComponents,\n saveSchema,\n reservedNames,\n components,\n contentTypes,\n initialComponents,\n initialContentTypes,\n isSaving,\n isModified,\n isInDevelopmentMode,\n allComponentsCategories,\n componentsGroupedByCategory,\n sortedContentTypesList,\n isLoading,\n addAttribute(payload) {\n dispatch(actions.addAttribute(payload));\n },\n editAttribute(payload) {\n dispatch(actions.editAttribute(payload));\n },\n addCustomFieldAttribute(payload) {\n dispatch(actions.addCustomFieldAttribute(payload));\n },\n editCustomFieldAttribute(payload) {\n dispatch(actions.editCustomFieldAttribute(payload));\n },\n addCreatedComponentToDynamicZone(payload) {\n dispatch(actions.addCreatedComponentToDynamicZone(payload));\n },\n createSchema(payload) {\n dispatch(actions.createSchema(payload));\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 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 dispatch(actions.updateSchema(args));\n },\n\n moveAttribute(args) {\n dispatch(actions.moveAttribute(args));\n },\n\n applyChange(args) {\n dispatch(actions.applyChange(args));\n },\n\n history: {\n undo() {\n dispatch(actions.undo());\n },\n\n redo() {\n dispatch(actions.redo());\n },\n\n discardAllChanges() {\n dispatch(actions.discardAll());\n },\n\n canUndo: state.past.length > 0,\n canRedo: state.future.length > 0,\n canDiscardAll: isModified,\n },\n };\n\n return <DataManagerContext.Provider value={context}>{children}</DataManagerContext.Provider>;\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default DataManagerProvider;\n"],"names":["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","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useCTBTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","previousLocationRef","useRef","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","undefined","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","pathname","reloadPlugin","currentPath","previousPath","CTB_PATH","isCTBPath","includes","wasCTBPath","getTrad","getAllComponentsThatHaveAComponentInTheirAttributes","composWithCompos","retrieveComponentsThatHaveComponents","getAllNestedComponents","appNestedCompo","retrieveNestedComponents","updatePermissions","saveSchema","PluginForms","apis","forms","mutatedCTs","Object","entries","reduce","acc","uid","mutateContentTypeSchema","requestData","trackingEventProperties","stateToRequestData","isSendingContentTypes","keys","length","post","success","payload","GUIDED_TOUR_REQUIRED_ACTIONS","contentTypeBuilder","createSchema","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createComponentSchema","componentCategory","changeDynamicZoneComponents","forTarget","targetUid","dynamicZoneTarget","newComponents","removeAttribute","removeField","removeComponentFromDynamicZone","deleteComponent","userConfirm","window","confirm","deleteContentType","updateComponentSchema","componentUID","updateComponentUid","newComponentUID","updateSchema","args","moveAttribute","applyChange","history","undo","redo","discardAllChanges","discardAll","canUndo","past","canRedo","future","canDiscardAll","_jsx","DataManagerContext","Provider","value"],"mappings":"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"}
@@ -5,6 +5,23 @@ var index = require('../utils/index.js');
5
5
  var contentType = require('./validation/content-type.js');
6
6
  var contentTypes$1 = require('../services/content-types.js');
7
7
 
8
+ /**
9
+ * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer
10
+ * dev reload so a stuck client cannot block restart indefinitely.
11
+ */ const RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;
12
+ const scheduleReloadAfterOutboundTelemetry = (sendPromise)=>{
13
+ setImmediate(()=>{
14
+ const settled = sendPromise.catch(()=>{});
15
+ Promise.race([
16
+ settled,
17
+ new Promise((resolve)=>{
18
+ setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);
19
+ })
20
+ ]).catch(()=>{}).finally(()=>{
21
+ strapi.reload();
22
+ });
23
+ });
24
+ };
8
25
  var contentTypes = {
9
26
  async getContentTypes (ctx) {
10
27
  const { kind } = ctx.query;
@@ -60,12 +77,8 @@ var contentTypes = {
60
77
  kind: contentType.kind
61
78
  }
62
79
  };
63
- if (_.isEmpty(strapi.apis)) {
64
- await strapi.telemetry.send('didCreateFirstContentType', metricsPayload);
65
- } else {
66
- await strapi.telemetry.send('didCreateContentType', metricsPayload);
67
- }
68
- setImmediate(()=>strapi.reload());
80
+ const telemetryPromise = _.isEmpty(strapi.apis) ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload) : strapi.telemetry.send('didCreateContentType', metricsPayload);
81
+ scheduleReloadAfterOutboundTelemetry(telemetryPromise);
69
82
  ctx.send({
70
83
  data: {
71
84
  uid: contentType.uid
@@ -73,11 +86,11 @@ var contentTypes = {
73
86
  }, 201);
74
87
  } catch (err) {
75
88
  strapi.log.error(err);
76
- await strapi.telemetry.send('didNotCreateContentType', {
89
+ strapi.telemetry.send('didNotCreateContentType', {
77
90
  eventProperties: {
78
91
  error: err.message || err
79
92
  }
80
- });
93
+ }).catch(()=>{});
81
94
  ctx.send({
82
95
  error: err.message || 'Unknown error'
83
96
  }, 400);
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n if (_.isEmpty(strapi.apis)) {\n await strapi.telemetry.send('didCreateFirstContentType', metricsPayload);\n } else {\n await strapi.telemetry.send('didCreateContentType', metricsPayload);\n }\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n await strapi.telemetry.send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n });\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","strapi","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","reload","isWatching","components","metricsPayload","eventProperties","isEmpty","apis","telemetry","setImmediate","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\n/**\n * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer\n * dev reload so a stuck client cannot block restart indefinitely.\n */\nconst RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;\n\nconst scheduleReloadAfterOutboundTelemetry = (sendPromise: Promise<unknown>): void => {\n setImmediate(() => {\n const settled = sendPromise.catch(() => {});\n Promise.race([\n settled,\n new Promise<void>((resolve) => {\n setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);\n }),\n ])\n .catch(() => {})\n .finally(() => {\n strapi.reload();\n });\n });\n};\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n const telemetryPromise = _.isEmpty(strapi.apis)\n ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload)\n : strapi.telemetry.send('didCreateContentType', metricsPayload);\n\n scheduleReloadAfterOutboundTelemetry(telemetryPromise);\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n strapi.telemetry\n .send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n })\n .catch(() => {});\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["RELOAD_AFTER_TELEMETRY_MAX_MS","scheduleReloadAfterOutboundTelemetry","sendPromise","setImmediate","settled","catch","Promise","race","resolve","setTimeout","finally","strapi","reload","getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","isWatching","components","metricsPayload","eventProperties","telemetryPromise","isEmpty","apis","telemetry","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
@@ -3,6 +3,23 @@ import { getService } from '../utils/index.mjs';
3
3
  import { validateUpdateContentTypeInput, validateContentTypeInput, validateKind } from './validation/content-type.mjs';
4
4
  import { isContentTypeVisible } from '../services/content-types.mjs';
5
5
 
6
+ /**
7
+ * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer
8
+ * dev reload so a stuck client cannot block restart indefinitely.
9
+ */ const RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;
10
+ const scheduleReloadAfterOutboundTelemetry = (sendPromise)=>{
11
+ setImmediate(()=>{
12
+ const settled = sendPromise.catch(()=>{});
13
+ Promise.race([
14
+ settled,
15
+ new Promise((resolve)=>{
16
+ setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);
17
+ })
18
+ ]).catch(()=>{}).finally(()=>{
19
+ strapi.reload();
20
+ });
21
+ });
22
+ };
6
23
  var contentTypes = {
7
24
  async getContentTypes (ctx) {
8
25
  const { kind } = ctx.query;
@@ -58,12 +75,8 @@ var contentTypes = {
58
75
  kind: contentType.kind
59
76
  }
60
77
  };
61
- if (_.isEmpty(strapi.apis)) {
62
- await strapi.telemetry.send('didCreateFirstContentType', metricsPayload);
63
- } else {
64
- await strapi.telemetry.send('didCreateContentType', metricsPayload);
65
- }
66
- setImmediate(()=>strapi.reload());
78
+ const telemetryPromise = _.isEmpty(strapi.apis) ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload) : strapi.telemetry.send('didCreateContentType', metricsPayload);
79
+ scheduleReloadAfterOutboundTelemetry(telemetryPromise);
67
80
  ctx.send({
68
81
  data: {
69
82
  uid: contentType.uid
@@ -71,11 +84,11 @@ var contentTypes = {
71
84
  }, 201);
72
85
  } catch (err) {
73
86
  strapi.log.error(err);
74
- await strapi.telemetry.send('didNotCreateContentType', {
87
+ strapi.telemetry.send('didNotCreateContentType', {
75
88
  eventProperties: {
76
89
  error: err.message || err
77
90
  }
78
- });
91
+ }).catch(()=>{});
79
92
  ctx.send({
80
93
  error: err.message || 'Unknown error'
81
94
  }, 400);
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n if (_.isEmpty(strapi.apis)) {\n await strapi.telemetry.send('didCreateFirstContentType', metricsPayload);\n } else {\n await strapi.telemetry.send('didCreateContentType', metricsPayload);\n }\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n await strapi.telemetry.send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n });\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","strapi","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","reload","isWatching","components","metricsPayload","eventProperties","isEmpty","apis","telemetry","setImmediate","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import _ from 'lodash';\nimport type { Context } from 'koa';\nimport type {} from 'koa-body';\nimport type { Internal } from '@strapi/types';\nimport { getService } from '../utils';\nimport {\n validateContentTypeInput,\n validateUpdateContentTypeInput,\n validateKind,\n} from './validation/content-type';\nimport { isContentTypeVisible } from '../services/content-types';\n\n/**\n * Telemetry uses a bounded HTTP timeout (~1s in the metrics sender); cap how long we defer\n * dev reload so a stuck client cannot block restart indefinitely.\n */\nconst RELOAD_AFTER_TELEMETRY_MAX_MS = 2500;\n\nconst scheduleReloadAfterOutboundTelemetry = (sendPromise: Promise<unknown>): void => {\n setImmediate(() => {\n const settled = sendPromise.catch(() => {});\n Promise.race([\n settled,\n new Promise<void>((resolve) => {\n setTimeout(resolve, RELOAD_AFTER_TELEMETRY_MAX_MS);\n }),\n ])\n .catch(() => {})\n .finally(() => {\n strapi.reload();\n });\n });\n};\n\nexport default {\n async getContentTypes(ctx: Context) {\n const { kind } = ctx.query;\n\n try {\n await validateKind(kind);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n const contentTypeService = getService('content-types');\n\n const contentTypes = Object.keys(strapi.contentTypes)\n .filter(\n (uid) =>\n !kind ||\n _.get(strapi.contentTypes[uid as Internal.UID.ContentType], 'kind', 'collectionType') ===\n kind\n )\n .map((uid) =>\n contentTypeService.formatContentType(strapi.contentTypes[uid as Internal.UID.ContentType])\n );\n\n ctx.send({\n data: contentTypes,\n });\n },\n\n getContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n const contentType = strapi.contentTypes[uid];\n\n if (!contentType) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n if (!isContentTypeVisible(contentType)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n const contentTypeService = getService('content-types');\n\n ctx.send({ data: contentTypeService.formatContentType(contentType) });\n },\n\n async createContentType(ctx: Context) {\n const body = ctx.request.body as any;\n\n try {\n await validateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const contentType = await contentTypeService.createContentType({\n contentType: body.contentType,\n components: body.components,\n });\n\n const metricsPayload = {\n eventProperties: {\n kind: contentType.kind,\n },\n };\n\n const telemetryPromise = _.isEmpty(strapi.apis)\n ? strapi.telemetry.send('didCreateFirstContentType', metricsPayload)\n : strapi.telemetry.send('didCreateContentType', metricsPayload);\n\n scheduleReloadAfterOutboundTelemetry(telemetryPromise);\n\n ctx.send({ data: { uid: contentType.uid } }, 201);\n } catch (err) {\n strapi.log.error(err);\n strapi.telemetry\n .send('didNotCreateContentType', {\n eventProperties: { error: (err as Error).message || err },\n })\n .catch(() => {});\n ctx.send({ error: (err as Error).message || 'Unknown error' }, 400);\n }\n },\n\n async updateContentType(ctx: Context) {\n const { uid } = ctx.params;\n const body = ctx.request.body as any;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n await validateUpdateContentTypeInput(body);\n } catch (error) {\n return ctx.send({ error }, 400);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.editContentType(uid, {\n contentType: body.contentType,\n components: body.components,\n });\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } }, 201);\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n\n async deleteContentType(ctx: Context) {\n const { uid } = ctx.params;\n\n if (!_.has(strapi.contentTypes, uid)) {\n return ctx.send({ error: 'contentType.notFound' }, 404);\n }\n\n try {\n strapi.reload.isWatching = false;\n\n const contentTypeService = getService('content-types');\n\n const component = await contentTypeService.deleteContentType(uid);\n\n setImmediate(() => strapi.reload());\n\n ctx.send({ data: { uid: component.uid } });\n } catch (error) {\n strapi.log.error(error);\n ctx.send({ error: (error as Error)?.message || 'Unknown error' }, 400);\n }\n },\n};\n"],"names":["RELOAD_AFTER_TELEMETRY_MAX_MS","scheduleReloadAfterOutboundTelemetry","sendPromise","setImmediate","settled","catch","Promise","race","resolve","setTimeout","finally","strapi","reload","getContentTypes","ctx","kind","query","validateKind","error","send","contentTypeService","getService","contentTypes","Object","keys","filter","uid","_","get","map","formatContentType","data","getContentType","params","contentType","isContentTypeVisible","createContentType","body","request","validateContentTypeInput","isWatching","components","metricsPayload","eventProperties","telemetryPromise","isEmpty","apis","telemetry","err","log","message","updateContentType","has","validateUpdateContentTypeInput","component","editContentType","deleteContentType"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;yBAYN,OAAO;wBA2Bd,OAAO;2BAkBE,OAAO;2BA2CP,OAAO;2BAiCP,OAAO;;AA1HtC,wBAgJE"}
1
+ {"version":3,"file":"content-types.d.ts","sourceRoot":"","sources":["../../../../server/src/controllers/content-types.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,KAAK,CAAC;;yBAkCN,OAAO;wBA2Bd,OAAO;2BAkBE,OAAO;2BA2CP,OAAO;2BAiCP,OAAO;;AA1HtC,wBAgJE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/content-type-builder",
3
- "version": "5.45.0",
3
+ "version": "5.46.0",
4
4
  "description": "Create and manage content types",
5
5
  "homepage": "https://strapi.io",
6
6
  "bugs": {
@@ -73,9 +73,9 @@
73
73
  "@reduxjs/toolkit": "1.9.7",
74
74
  "@sindresorhus/slugify": "1.1.0",
75
75
  "@strapi/design-system": "2.2.0",
76
- "@strapi/generators": "5.45.0",
76
+ "@strapi/generators": "5.46.0",
77
77
  "@strapi/icons": "2.2.0",
78
- "@strapi/utils": "5.45.0",
78
+ "@strapi/utils": "5.46.0",
79
79
  "ai": "5.0.52",
80
80
  "date-fns": "2.30.0",
81
81
  "fs-extra": "11.3.4",
@@ -93,8 +93,8 @@
93
93
  "zod": "3.25.67"
94
94
  },
95
95
  "devDependencies": {
96
- "@strapi/admin": "5.45.0",
97
- "@strapi/types": "5.45.0",
96
+ "@strapi/admin": "5.46.0",
97
+ "@strapi/types": "5.46.0",
98
98
  "@testing-library/dom": "10.4.1",
99
99
  "@testing-library/react": "16.3.0",
100
100
  "@testing-library/user-event": "14.6.1",