@strapi/content-type-builder 5.20.0 → 5.21.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.
@@ -152,10 +152,10 @@ const DataManagerProvider = ({ children })=>{
152
152
  }
153
153
  // Make sure the server has restarted
154
154
  await serverRestartWatcher();
155
- // Invalidate the guided tour meta query cache
156
- // @ts-expect-error typescript is unable to infer the tag types defined on adminApi
155
+ // Invalidate the guided tour meta and homepage key statistics widget query cache
157
156
  dispatch(strapiAdmin.adminApi.util.invalidateTags([
158
- 'GuidedTourMeta'
157
+ 'GuidedTourMeta',
158
+ 'HomepageKeyStatistics'
159
159
  ]));
160
160
  // refetch and update initial state after the data has been saved
161
161
  await getDataRef.current();
@@ -1 +1 @@
1
- {"version":3,"file":"DataManagerProvider.js","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useTracking,\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\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';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\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\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 } = useTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\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\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 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 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 trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Invalidate the guided tour meta query cache\n // @ts-expect-error typescript is unable to infer the tag types defined on adminApi\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta']));\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', { ...trackingEventProperties, success: false });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n trackUsage('didUpdateCTBSchema', { ...trackingEventProperties, success: true });\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 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","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","useRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","reloadPlugin","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","adminApi","util","invalidateTags","success","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","payload","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createSchema","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 useTracking,\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\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';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\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\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 } = useTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\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\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 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 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 trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Invalidate the guided tour meta and homepage key statistics widget query cache\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\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', { ...trackingEventProperties, success: false });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n trackUsage('didUpdateCTBSchema', { ...trackingEventProperties, success: true });\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 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","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","useRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","reloadPlugin","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","adminApi","util","invalidateTags","success","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","payload","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createSchema","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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"}
@@ -131,10 +131,10 @@ const DataManagerProvider = ({ children })=>{
131
131
  }
132
132
  // Make sure the server has restarted
133
133
  await serverRestartWatcher();
134
- // Invalidate the guided tour meta query cache
135
- // @ts-expect-error typescript is unable to infer the tag types defined on adminApi
134
+ // Invalidate the guided tour meta and homepage key statistics widget query cache
136
135
  dispatch(adminApi.util.invalidateTags([
137
- 'GuidedTourMeta'
136
+ 'GuidedTourMeta',
137
+ 'HomepageKeyStatistics'
138
138
  ]));
139
139
  // refetch and update initial state after the data has been saved
140
140
  await getDataRef.current();
@@ -1 +1 @@
1
- {"version":3,"file":"DataManagerProvider.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useTracking,\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\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';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\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\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 } = useTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\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\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 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 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 trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Invalidate the guided tour meta query cache\n // @ts-expect-error typescript is unable to infer the tag types defined on adminApi\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta']));\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', { ...trackingEventProperties, success: false });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n trackUsage('didUpdateCTBSchema', { ...trackingEventProperties, success: true });\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 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","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","useRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","reloadPlugin","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","adminApi","util","invalidateTags","success","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","payload","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createSchema","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.mjs","sources":["../../../../admin/src/components/DataManager/DataManagerProvider.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n useTracking,\n useStrapiApp,\n useNotification,\n useAppInfo,\n useFetchClient,\n useAuth,\n adminApi,\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';\n\nimport { getTrad } from '../../utils/getTrad';\nimport { useAutoReloadOverlayBlocker } from '../AutoReloadOverlayBlocker';\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\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 } = useTracking();\n const refetchPermissions = useAuth('DataManagerProvider', (state) => state.refetchPermissions);\n const { onCloseModal } = useFormModalNavigation();\n\n const [isSaving, setIsSaving] = React.useState(false);\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\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 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 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 trackUsage('didCreateGuidedTourCollectionType');\n }\n\n // Make sure the server has restarted\n await serverRestartWatcher();\n // Invalidate the guided tour meta and homepage key statistics widget query cache\n dispatch(adminApi.util.invalidateTags(['GuidedTourMeta', 'HomepageKeyStatistics']));\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', { ...trackingEventProperties, success: false });\n } finally {\n setIsSaving(false);\n unlockAppWithAutoreload();\n\n trackUsage('didUpdateCTBSchema', { ...trackingEventProperties, success: true });\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 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","components","contentTypes","reservedNames","initialComponents","initialContentTypes","isLoading","current","toggleNotification","useNotification","lockAppWithAutoreload","unlockAppWithAutoreload","useAutoReloadOverlayBlocker","serverRestartWatcher","useServerRestartWatcher","getPlugin","useStrapiApp","plugin","autoReload","useAppInfo","formatMessage","useIntl","trackUsage","useTracking","refetchPermissions","useAuth","onCloseModal","useFormModalNavigation","isSaving","setIsSaving","React","useState","isModified","useMemo","isEqual","fetchClient","useFetchClient","isInDevelopmentMode","getDataRef","useRef","schemaResponse","reservedNamesResponse","Promise","all","get","data","actions","init","mapValues","component","status","contentType","clearHistory","err","console","error","type","message","id","defaultMessage","useEffect","reloadPlugin","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","adminApi","util","invalidateTags","success","componentsThatHaveOtherComponentInTheirAttributes","nestedComponents","allComponentsCategories","retrieveSpecificInfoFromComponents","componentsGroupedByCategory","groupBy","sortedContentTypesList","sortContentType","context","addAttribute","payload","editAttribute","addCustomFieldAttribute","editCustomFieldAttribute","addCreatedComponentToDynamicZone","createSchema","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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"}
@@ -11,36 +11,39 @@ const PluralName = ({ description, error, intlLabel, modifiedData, name, onChang
11
11
  const { formatMessage } = reactIntl.useIntl();
12
12
  const onChangeRef = React.useRef(onChange);
13
13
  const displayName = modifiedData?.displayName || '';
14
+ const previousDisplayName = React.useRef(displayName);
15
+ const previousValue = React.useRef(value);
14
16
  React.useEffect(()=>{
15
- if (displayName) {
16
- const value = nameToSlug.nameToSlug(displayName);
17
+ if (displayName && displayName !== previousDisplayName.current) {
18
+ const baseValue = nameToSlug.nameToSlug(displayName);
19
+ let newValue = baseValue;
17
20
  try {
18
- const plural = pluralize(value, 2);
19
- onChangeRef.current({
20
- target: {
21
- name,
22
- value: plural
23
- }
24
- });
21
+ newValue = pluralize(baseValue, 2);
25
22
  } catch (err) {
26
- onChangeRef.current({
27
- target: {
28
- name,
29
- value
30
- }
31
- });
23
+ // If pluralize fails, use the base value
32
24
  }
33
- } else {
25
+ onChangeRef.current({
26
+ target: {
27
+ name,
28
+ value: newValue
29
+ }
30
+ });
31
+ previousValue.current = newValue;
32
+ previousDisplayName.current = displayName;
33
+ } else if (!displayName) {
34
34
  onChangeRef.current({
35
35
  target: {
36
36
  name,
37
37
  value: ''
38
38
  }
39
39
  });
40
+ previousValue.current = '';
41
+ previousDisplayName.current = '';
40
42
  }
41
43
  }, [
42
44
  displayName,
43
- name
45
+ name,
46
+ value
44
47
  ]);
45
48
  const errorMessage = error ? formatMessage({
46
49
  id: error,
@@ -1 +1 @@
1
- {"version":3,"file":"PluralName.js","sources":["../../../admin/src/components/PluralName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface Description {\n id: string;\n defaultMessage: string;\n values?: Record<string, any>;\n}\n\ninterface PluralNameProps {\n description?: Description;\n error?: string;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string;\n}\n\nexport const PluralName = ({\n description,\n error,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value,\n}: PluralNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName) {\n const value = nameToSlug(displayName);\n\n try {\n const plural = pluralize(value, 2);\n onChangeRef.current({ target: { name, value: plural } });\n } catch (err) {\n onChangeRef.current({ target: { name, value } });\n }\n } else {\n onChangeRef.current({ target: { name, value: '' } });\n }\n }, [displayName, name]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n </Field.Root>\n );\n};\n"],"names":["PluralName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","useEffect","nameToSlug","plural","pluralize","current","target","err","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error"],"mappings":";;;;;;;;;MA0BaA,UAAa,GAAA,CAAC,EACzBC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAK,EACW,GAAA;IAChB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,YAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;IAEjDC,eAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAa,EAAA;AACf,YAAA,MAAML,QAAQO,qBAAWF,CAAAA,WAAAA,CAAAA;YAEzB,IAAI;gBACF,MAAMG,MAAAA,GAASC,UAAUT,KAAO,EAAA,CAAA,CAAA;AAChCG,gBAAAA,WAAAA,CAAYO,OAAO,CAAC;oBAAEC,MAAQ,EAAA;AAAEb,wBAAAA,IAAAA;wBAAME,KAAOQ,EAAAA;AAAO;AAAE,iBAAA,CAAA;AACxD,aAAA,CAAE,OAAOI,GAAK,EAAA;AACZT,gBAAAA,WAAAA,CAAYO,OAAO,CAAC;oBAAEC,MAAQ,EAAA;AAAEb,wBAAAA,IAAAA;AAAME,wBAAAA;AAAM;AAAE,iBAAA,CAAA;AAChD;SACK,MAAA;AACLG,YAAAA,WAAAA,CAAYO,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEb,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AACpD;KACC,EAAA;AAACK,QAAAA,WAAAA;AAAaP,QAAAA;AAAK,KAAA,CAAA;IAEtB,MAAMe,YAAAA,GAAelB,QAAQM,aAAc,CAAA;QAAEa,EAAInB,EAAAA,KAAAA;QAAOoB,cAAgBpB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMqB,IAAAA,GAAOtB,cACTO,aACE,CAAA;AAAEa,QAAAA,EAAAA,EAAIpB,YAAYoB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBrB,YAAYqB;KAClD,EAAA;AAAE,QAAA,GAAGrB,YAAYuB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQjB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEuB,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAAC1B,KAAOkB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMlB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAwB,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,cAACE,CAAAA,sBAAAA,EAAAA;gBAAUzB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAsB,cAAA,CAACF,mBAAMK,KAAK,EAAA,EAAA;;;AAGlB;;;;"}
1
+ {"version":3,"file":"PluralName.js","sources":["../../../admin/src/components/PluralName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface Description {\n id: string;\n defaultMessage: string;\n values?: Record<string, any>;\n}\n\ninterface PluralNameProps {\n description?: Description;\n error?: string;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string;\n}\n\nexport const PluralName = ({\n description,\n error,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value,\n}: PluralNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n const previousDisplayName = useRef(displayName);\n const previousValue = useRef(value);\n\n useEffect(() => {\n if (displayName && displayName !== previousDisplayName.current) {\n const baseValue = nameToSlug(displayName);\n let newValue = baseValue;\n\n try {\n newValue = pluralize(baseValue, 2);\n } catch (err) {\n // If pluralize fails, use the base value\n }\n\n onChangeRef.current({ target: { name, value: newValue } });\n previousValue.current = newValue;\n previousDisplayName.current = displayName;\n } else if (!displayName) {\n onChangeRef.current({ target: { name, value: '' } });\n previousValue.current = '';\n previousDisplayName.current = '';\n }\n }, [displayName, name, value]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n </Field.Root>\n );\n};\n"],"names":["PluralName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","previousDisplayName","previousValue","useEffect","current","baseValue","nameToSlug","newValue","pluralize","err","target","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error"],"mappings":";;;;;;;;;MA0BaA,UAAa,GAAA,CAAC,EACzBC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAK,EACW,GAAA;IAChB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,YAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;AACjD,IAAA,MAAMC,sBAAsBF,YAAOC,CAAAA,WAAAA,CAAAA;AACnC,IAAA,MAAME,gBAAgBH,YAAOJ,CAAAA,KAAAA,CAAAA;IAE7BQ,eAAU,CAAA,IAAA;AACR,QAAA,IAAIH,WAAeA,IAAAA,WAAAA,KAAgBC,mBAAoBG,CAAAA,OAAO,EAAE;AAC9D,YAAA,MAAMC,YAAYC,qBAAWN,CAAAA,WAAAA,CAAAA;AAC7B,YAAA,IAAIO,QAAWF,GAAAA,SAAAA;YAEf,IAAI;AACFE,gBAAAA,QAAAA,GAAWC,UAAUH,SAAW,EAAA,CAAA,CAAA;AAClC,aAAA,CAAE,OAAOI,GAAK,EAAA;;AAEd;AAEAX,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEM,MAAQ,EAAA;AAAEjB,oBAAAA,IAAAA;oBAAME,KAAOY,EAAAA;AAAS;AAAE,aAAA,CAAA;AACxDL,YAAAA,aAAAA,CAAcE,OAAO,GAAGG,QAAAA;AACxBN,YAAAA,mBAAAA,CAAoBG,OAAO,GAAGJ,WAAAA;SACzB,MAAA,IAAI,CAACA,WAAa,EAAA;AACvBF,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEM,MAAQ,EAAA;AAAEjB,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AAClDO,YAAAA,aAAAA,CAAcE,OAAO,GAAG,EAAA;AACxBH,YAAAA,mBAAAA,CAAoBG,OAAO,GAAG,EAAA;AAChC;KACC,EAAA;AAACJ,QAAAA,WAAAA;AAAaP,QAAAA,IAAAA;AAAME,QAAAA;AAAM,KAAA,CAAA;IAE7B,MAAMgB,YAAAA,GAAerB,QAAQM,aAAc,CAAA;QAAEgB,EAAItB,EAAAA,KAAAA;QAAOuB,cAAgBvB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMwB,IAAAA,GAAOzB,cACTO,aACE,CAAA;AAAEgB,QAAAA,EAAAA,EAAIvB,YAAYuB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBxB,YAAYwB;KAClD,EAAA;AAAE,QAAA,GAAGxB,YAAY0B;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQpB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACE0B,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAAC7B,KAAOqB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMrB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAA2B,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,cAACE,CAAAA,sBAAAA,EAAAA;gBAAU5B,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAyB,cAAA,CAACF,mBAAMK,KAAK,EAAA,EAAA;;;AAGlB;;;;"}
@@ -9,36 +9,39 @@ const PluralName = ({ description, error, intlLabel, modifiedData, name, onChang
9
9
  const { formatMessage } = useIntl();
10
10
  const onChangeRef = useRef(onChange);
11
11
  const displayName = modifiedData?.displayName || '';
12
+ const previousDisplayName = useRef(displayName);
13
+ const previousValue = useRef(value);
12
14
  useEffect(()=>{
13
- if (displayName) {
14
- const value = nameToSlug(displayName);
15
+ if (displayName && displayName !== previousDisplayName.current) {
16
+ const baseValue = nameToSlug(displayName);
17
+ let newValue = baseValue;
15
18
  try {
16
- const plural = pluralize(value, 2);
17
- onChangeRef.current({
18
- target: {
19
- name,
20
- value: plural
21
- }
22
- });
19
+ newValue = pluralize(baseValue, 2);
23
20
  } catch (err) {
24
- onChangeRef.current({
25
- target: {
26
- name,
27
- value
28
- }
29
- });
21
+ // If pluralize fails, use the base value
30
22
  }
31
- } else {
23
+ onChangeRef.current({
24
+ target: {
25
+ name,
26
+ value: newValue
27
+ }
28
+ });
29
+ previousValue.current = newValue;
30
+ previousDisplayName.current = displayName;
31
+ } else if (!displayName) {
32
32
  onChangeRef.current({
33
33
  target: {
34
34
  name,
35
35
  value: ''
36
36
  }
37
37
  });
38
+ previousValue.current = '';
39
+ previousDisplayName.current = '';
38
40
  }
39
41
  }, [
40
42
  displayName,
41
- name
43
+ name,
44
+ value
42
45
  ]);
43
46
  const errorMessage = error ? formatMessage({
44
47
  id: error,
@@ -1 +1 @@
1
- {"version":3,"file":"PluralName.mjs","sources":["../../../admin/src/components/PluralName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface Description {\n id: string;\n defaultMessage: string;\n values?: Record<string, any>;\n}\n\ninterface PluralNameProps {\n description?: Description;\n error?: string;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string;\n}\n\nexport const PluralName = ({\n description,\n error,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value,\n}: PluralNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName) {\n const value = nameToSlug(displayName);\n\n try {\n const plural = pluralize(value, 2);\n onChangeRef.current({ target: { name, value: plural } });\n } catch (err) {\n onChangeRef.current({ target: { name, value } });\n }\n } else {\n onChangeRef.current({ target: { name, value: '' } });\n }\n }, [displayName, name]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n </Field.Root>\n );\n};\n"],"names":["PluralName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","useEffect","nameToSlug","plural","pluralize","current","target","err","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error"],"mappings":";;;;;;;MA0BaA,UAAa,GAAA,CAAC,EACzBC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAK,EACW,GAAA;IAChB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,MAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;IAEjDC,SAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAa,EAAA;AACf,YAAA,MAAML,QAAQO,UAAWF,CAAAA,WAAAA,CAAAA;YAEzB,IAAI;gBACF,MAAMG,MAAAA,GAASC,UAAUT,KAAO,EAAA,CAAA,CAAA;AAChCG,gBAAAA,WAAAA,CAAYO,OAAO,CAAC;oBAAEC,MAAQ,EAAA;AAAEb,wBAAAA,IAAAA;wBAAME,KAAOQ,EAAAA;AAAO;AAAE,iBAAA,CAAA;AACxD,aAAA,CAAE,OAAOI,GAAK,EAAA;AACZT,gBAAAA,WAAAA,CAAYO,OAAO,CAAC;oBAAEC,MAAQ,EAAA;AAAEb,wBAAAA,IAAAA;AAAME,wBAAAA;AAAM;AAAE,iBAAA,CAAA;AAChD;SACK,MAAA;AACLG,YAAAA,WAAAA,CAAYO,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEb,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AACpD;KACC,EAAA;AAACK,QAAAA,WAAAA;AAAaP,QAAAA;AAAK,KAAA,CAAA;IAEtB,MAAMe,YAAAA,GAAelB,QAAQM,aAAc,CAAA;QAAEa,EAAInB,EAAAA,KAAAA;QAAOoB,cAAgBpB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMqB,IAAAA,GAAOtB,cACTO,aACE,CAAA;AAAEa,QAAAA,EAAAA,EAAIpB,YAAYoB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBrB,YAAYqB;KAClD,EAAA;AAAE,QAAA,GAAGrB,YAAYuB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQjB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEuB,IAAA,CAACC,MAAMC,IAAI,EAAA;QAAC1B,KAAOkB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMlB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAwB,GAAA,CAACF,MAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,GAACE,CAAAA,SAAAA,EAAAA;gBAAUzB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAsB,GAAA,CAACF,MAAMK,KAAK,EAAA,EAAA;;;AAGlB;;;;"}
1
+ {"version":3,"file":"PluralName.mjs","sources":["../../../admin/src/components/PluralName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport pluralize from 'pluralize';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface Description {\n id: string;\n defaultMessage: string;\n values?: Record<string, any>;\n}\n\ninterface PluralNameProps {\n description?: Description;\n error?: string;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string;\n}\n\nexport const PluralName = ({\n description,\n error,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value,\n}: PluralNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n const previousDisplayName = useRef(displayName);\n const previousValue = useRef(value);\n\n useEffect(() => {\n if (displayName && displayName !== previousDisplayName.current) {\n const baseValue = nameToSlug(displayName);\n let newValue = baseValue;\n\n try {\n newValue = pluralize(baseValue, 2);\n } catch (err) {\n // If pluralize fails, use the base value\n }\n\n onChangeRef.current({ target: { name, value: newValue } });\n previousValue.current = newValue;\n previousDisplayName.current = displayName;\n } else if (!displayName) {\n onChangeRef.current({ target: { name, value: '' } });\n previousValue.current = '';\n previousDisplayName.current = '';\n }\n }, [displayName, name, value]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n </Field.Root>\n );\n};\n"],"names":["PluralName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","previousDisplayName","previousValue","useEffect","current","baseValue","nameToSlug","newValue","pluralize","err","target","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error"],"mappings":";;;;;;;MA0BaA,UAAa,GAAA,CAAC,EACzBC,WAAW,EACXC,KAAK,EACLC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAK,EACW,GAAA;IAChB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,MAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;AACjD,IAAA,MAAMC,sBAAsBF,MAAOC,CAAAA,WAAAA,CAAAA;AACnC,IAAA,MAAME,gBAAgBH,MAAOJ,CAAAA,KAAAA,CAAAA;IAE7BQ,SAAU,CAAA,IAAA;AACR,QAAA,IAAIH,WAAeA,IAAAA,WAAAA,KAAgBC,mBAAoBG,CAAAA,OAAO,EAAE;AAC9D,YAAA,MAAMC,YAAYC,UAAWN,CAAAA,WAAAA,CAAAA;AAC7B,YAAA,IAAIO,QAAWF,GAAAA,SAAAA;YAEf,IAAI;AACFE,gBAAAA,QAAAA,GAAWC,UAAUH,SAAW,EAAA,CAAA,CAAA;AAClC,aAAA,CAAE,OAAOI,GAAK,EAAA;;AAEd;AAEAX,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEM,MAAQ,EAAA;AAAEjB,oBAAAA,IAAAA;oBAAME,KAAOY,EAAAA;AAAS;AAAE,aAAA,CAAA;AACxDL,YAAAA,aAAAA,CAAcE,OAAO,GAAGG,QAAAA;AACxBN,YAAAA,mBAAAA,CAAoBG,OAAO,GAAGJ,WAAAA;SACzB,MAAA,IAAI,CAACA,WAAa,EAAA;AACvBF,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEM,MAAQ,EAAA;AAAEjB,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AAClDO,YAAAA,aAAAA,CAAcE,OAAO,GAAG,EAAA;AACxBH,YAAAA,mBAAAA,CAAoBG,OAAO,GAAG,EAAA;AAChC;KACC,EAAA;AAACJ,QAAAA,WAAAA;AAAaP,QAAAA,IAAAA;AAAME,QAAAA;AAAM,KAAA,CAAA;IAE7B,MAAMgB,YAAAA,GAAerB,QAAQM,aAAc,CAAA;QAAEgB,EAAItB,EAAAA,KAAAA;QAAOuB,cAAgBvB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMwB,IAAAA,GAAOzB,cACTO,aACE,CAAA;AAAEgB,QAAAA,EAAAA,EAAIvB,YAAYuB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBxB,YAAYwB;KAClD,EAAA;AAAE,QAAA,GAAGxB,YAAY0B;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQpB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACE0B,IAAA,CAACC,MAAMC,IAAI,EAAA;QAAC7B,KAAOqB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMrB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAA2B,GAAA,CAACF,MAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,GAACE,CAAAA,SAAAA,EAAAA;gBAAU5B,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAyB,GAAA,CAACF,MAAMK,KAAK,EAAA,EAAA;;;AAGlB;;;;"}
@@ -9,26 +9,34 @@ var nameToSlug = require('../utils/nameToSlug.js');
9
9
  const SingularName = ({ description = null, error = null, intlLabel, modifiedData, name, onChange, value = null })=>{
10
10
  const { formatMessage } = reactIntl.useIntl();
11
11
  const onChangeRef = React.useRef(onChange);
12
+ const previousValue = React.useRef(value);
13
+ const previousDisplayName = React.useRef(modifiedData?.displayName || '');
12
14
  const displayName = modifiedData?.displayName || '';
13
15
  React.useEffect(()=>{
14
- if (displayName) {
16
+ if (displayName && displayName !== previousDisplayName.current) {
17
+ const newValue = nameToSlug.nameToSlug(displayName);
15
18
  onChangeRef.current({
16
19
  target: {
17
20
  name,
18
- value: nameToSlug.nameToSlug(displayName)
21
+ value: newValue
19
22
  }
20
23
  });
21
- } else {
24
+ previousValue.current = newValue;
25
+ previousDisplayName.current = displayName;
26
+ } else if (!displayName) {
22
27
  onChangeRef.current({
23
28
  target: {
24
29
  name,
25
30
  value: ''
26
31
  }
27
32
  });
33
+ previousValue.current = '';
34
+ previousDisplayName.current = '';
28
35
  }
29
36
  }, [
30
37
  displayName,
31
- name
38
+ name,
39
+ value
32
40
  ]);
33
41
  const errorMessage = error ? formatMessage({
34
42
  id: error,
@@ -1 +1 @@
1
- {"version":3,"file":"SingularName.js","sources":["../../../admin/src/components/SingularName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface SingularNameProps {\n description?: IntlLabel | null;\n error?: string | null;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string | null;\n}\n\nexport const SingularName = ({\n description = null,\n error = null,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value = null,\n}: SingularNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName) {\n onChangeRef.current({ target: { name, value: nameToSlug(displayName) } });\n } else {\n onChangeRef.current({ target: { name, value: '' } });\n }\n }, [displayName, name]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n"],"names":["SingularName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","useEffect","current","target","nameToSlug","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error","Hint"],"mappings":";;;;;;;;AAmBO,MAAMA,eAAe,CAAC,EAC3BC,cAAc,IAAI,EAClBC,QAAQ,IAAI,EACZC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAAA,GAAQ,IAAI,EACM,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,YAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;IAEjDC,eAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAa,EAAA;AACfF,YAAAA,WAAAA,CAAYI,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEV,oBAAAA,IAAAA;AAAME,oBAAAA,KAAAA,EAAOS,qBAAWJ,CAAAA,WAAAA;AAAa;AAAE,aAAA,CAAA;SAClE,MAAA;AACLF,YAAAA,WAAAA,CAAYI,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEV,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AACpD;KACC,EAAA;AAACK,QAAAA,WAAAA;AAAaP,QAAAA;AAAK,KAAA,CAAA;IAEtB,MAAMY,YAAAA,GAAef,QAAQM,aAAc,CAAA;QAAEU,EAAIhB,EAAAA,KAAAA;QAAOiB,cAAgBjB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMkB,IAAAA,GAAOnB,cACTO,aACE,CAAA;AAAEU,QAAAA,EAAAA,EAAIjB,YAAYiB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBlB,YAAYkB;KAClD,EAAA;AAAE,QAAA,GAAGlB,YAAYoB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQd,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEoB,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAACvB,KAAOe,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMf,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAqB,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,cAACE,CAAAA,sBAAAA,EAAAA;gBAAUtB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAmB,cAAA,CAACF,mBAAMK,KAAK,EAAA,EAAA,CAAA;AACZ,0BAAAH,cAAA,CAACF,mBAAMM,IAAI,EAAA,EAAA;;;AAGjB;;;;"}
1
+ {"version":3,"file":"SingularName.js","sources":["../../../admin/src/components/SingularName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface SingularNameProps {\n description?: IntlLabel | null;\n error?: string | null;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string | null;\n}\n\nexport const SingularName = ({\n description = null,\n error = null,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value = null,\n}: SingularNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const previousValue = useRef(value);\n const previousDisplayName = useRef(modifiedData?.displayName || '');\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName && displayName !== previousDisplayName.current) {\n const newValue = nameToSlug(displayName);\n onChangeRef.current({ target: { name, value: newValue } });\n previousValue.current = newValue;\n previousDisplayName.current = displayName;\n } else if (!displayName) {\n onChangeRef.current({ target: { name, value: '' } });\n previousValue.current = '';\n previousDisplayName.current = '';\n }\n }, [displayName, name, value]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n"],"names":["SingularName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","previousValue","previousDisplayName","displayName","useEffect","current","newValue","nameToSlug","target","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error","Hint"],"mappings":";;;;;;;;AAmBO,MAAMA,eAAe,CAAC,EAC3BC,cAAc,IAAI,EAClBC,QAAQ,IAAI,EACZC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAAA,GAAQ,IAAI,EACM,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,YAAOL,CAAAA,QAAAA,CAAAA;AAC3B,IAAA,MAAMM,gBAAgBD,YAAOJ,CAAAA,KAAAA,CAAAA;IAC7B,MAAMM,mBAAAA,GAAsBF,YAAOP,CAAAA,YAAAA,EAAcU,WAAe,IAAA,EAAA,CAAA;IAChE,MAAMA,WAAAA,GAAcV,cAAcU,WAAe,IAAA,EAAA;IAEjDC,eAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAeA,IAAAA,WAAAA,KAAgBD,mBAAoBG,CAAAA,OAAO,EAAE;AAC9D,YAAA,MAAMC,WAAWC,qBAAWJ,CAAAA,WAAAA,CAAAA;AAC5BJ,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEG,MAAQ,EAAA;AAAEd,oBAAAA,IAAAA;oBAAME,KAAOU,EAAAA;AAAS;AAAE,aAAA,CAAA;AACxDL,YAAAA,aAAAA,CAAcI,OAAO,GAAGC,QAAAA;AACxBJ,YAAAA,mBAAAA,CAAoBG,OAAO,GAAGF,WAAAA;SACzB,MAAA,IAAI,CAACA,WAAa,EAAA;AACvBJ,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEG,MAAQ,EAAA;AAAEd,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AAClDK,YAAAA,aAAAA,CAAcI,OAAO,GAAG,EAAA;AACxBH,YAAAA,mBAAAA,CAAoBG,OAAO,GAAG,EAAA;AAChC;KACC,EAAA;AAACF,QAAAA,WAAAA;AAAaT,QAAAA,IAAAA;AAAME,QAAAA;AAAM,KAAA,CAAA;IAE7B,MAAMa,YAAAA,GAAelB,QAAQM,aAAc,CAAA;QAAEa,EAAInB,EAAAA,KAAAA;QAAOoB,cAAgBpB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMqB,IAAAA,GAAOtB,cACTO,aACE,CAAA;AAAEa,QAAAA,EAAAA,EAAIpB,YAAYoB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBrB,YAAYqB;KAClD,EAAA;AAAE,QAAA,GAAGrB,YAAYuB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQjB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEuB,eAAA,CAACC,mBAAMC,IAAI,EAAA;QAAC1B,KAAOkB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMlB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAwB,cAAA,CAACF,mBAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,cAACE,CAAAA,sBAAAA,EAAAA;gBAAUzB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAsB,cAAA,CAACF,mBAAMK,KAAK,EAAA,EAAA,CAAA;AACZ,0BAAAH,cAAA,CAACF,mBAAMM,IAAI,EAAA,EAAA;;;AAGjB;;;;"}
@@ -7,26 +7,34 @@ import { nameToSlug } from '../utils/nameToSlug.mjs';
7
7
  const SingularName = ({ description = null, error = null, intlLabel, modifiedData, name, onChange, value = null })=>{
8
8
  const { formatMessage } = useIntl();
9
9
  const onChangeRef = useRef(onChange);
10
+ const previousValue = useRef(value);
11
+ const previousDisplayName = useRef(modifiedData?.displayName || '');
10
12
  const displayName = modifiedData?.displayName || '';
11
13
  useEffect(()=>{
12
- if (displayName) {
14
+ if (displayName && displayName !== previousDisplayName.current) {
15
+ const newValue = nameToSlug(displayName);
13
16
  onChangeRef.current({
14
17
  target: {
15
18
  name,
16
- value: nameToSlug(displayName)
19
+ value: newValue
17
20
  }
18
21
  });
19
- } else {
22
+ previousValue.current = newValue;
23
+ previousDisplayName.current = displayName;
24
+ } else if (!displayName) {
20
25
  onChangeRef.current({
21
26
  target: {
22
27
  name,
23
28
  value: ''
24
29
  }
25
30
  });
31
+ previousValue.current = '';
32
+ previousDisplayName.current = '';
26
33
  }
27
34
  }, [
28
35
  displayName,
29
- name
36
+ name,
37
+ value
30
38
  ]);
31
39
  const errorMessage = error ? formatMessage({
32
40
  id: error,
@@ -1 +1 @@
1
- {"version":3,"file":"SingularName.mjs","sources":["../../../admin/src/components/SingularName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface SingularNameProps {\n description?: IntlLabel | null;\n error?: string | null;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string | null;\n}\n\nexport const SingularName = ({\n description = null,\n error = null,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value = null,\n}: SingularNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName) {\n onChangeRef.current({ target: { name, value: nameToSlug(displayName) } });\n } else {\n onChangeRef.current({ target: { name, value: '' } });\n }\n }, [displayName, name]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n"],"names":["SingularName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","displayName","useEffect","current","target","nameToSlug","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error","Hint"],"mappings":";;;;;;AAmBO,MAAMA,eAAe,CAAC,EAC3BC,cAAc,IAAI,EAClBC,QAAQ,IAAI,EACZC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAAA,GAAQ,IAAI,EACM,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,MAAOL,CAAAA,QAAAA,CAAAA;IAC3B,MAAMM,WAAAA,GAAcR,cAAcQ,WAAe,IAAA,EAAA;IAEjDC,SAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAa,EAAA;AACfF,YAAAA,WAAAA,CAAYI,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEV,oBAAAA,IAAAA;AAAME,oBAAAA,KAAAA,EAAOS,UAAWJ,CAAAA,WAAAA;AAAa;AAAE,aAAA,CAAA;SAClE,MAAA;AACLF,YAAAA,WAAAA,CAAYI,OAAO,CAAC;gBAAEC,MAAQ,EAAA;AAAEV,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AACpD;KACC,EAAA;AAACK,QAAAA,WAAAA;AAAaP,QAAAA;AAAK,KAAA,CAAA;IAEtB,MAAMY,YAAAA,GAAef,QAAQM,aAAc,CAAA;QAAEU,EAAIhB,EAAAA,KAAAA;QAAOiB,cAAgBjB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMkB,IAAAA,GAAOnB,cACTO,aACE,CAAA;AAAEU,QAAAA,EAAAA,EAAIjB,YAAYiB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBlB,YAAYkB;KAClD,EAAA;AAAE,QAAA,GAAGlB,YAAYoB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQd,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEoB,IAAA,CAACC,MAAMC,IAAI,EAAA;QAACvB,KAAOe,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMf,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAqB,GAAA,CAACF,MAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,GAACE,CAAAA,SAAAA,EAAAA;gBAAUtB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAmB,GAAA,CAACF,MAAMK,KAAK,EAAA,EAAA,CAAA;AACZ,0BAAAH,GAAA,CAACF,MAAMM,IAAI,EAAA,EAAA;;;AAGjB;;;;"}
1
+ {"version":3,"file":"SingularName.mjs","sources":["../../../admin/src/components/SingularName.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\n\nimport { Field, TextInput } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { nameToSlug } from '../utils/nameToSlug';\n\nimport type { IntlLabel } from '../types';\n\ninterface SingularNameProps {\n description?: IntlLabel | null;\n error?: string | null;\n intlLabel: IntlLabel;\n modifiedData: Record<string, any>;\n name: string;\n onChange: (value: { target: { name: string; value: string } }) => void;\n value?: string | null;\n}\n\nexport const SingularName = ({\n description = null,\n error = null,\n intlLabel,\n modifiedData,\n name,\n onChange,\n value = null,\n}: SingularNameProps) => {\n const { formatMessage } = useIntl();\n const onChangeRef = useRef(onChange);\n const previousValue = useRef(value);\n const previousDisplayName = useRef(modifiedData?.displayName || '');\n const displayName = modifiedData?.displayName || '';\n\n useEffect(() => {\n if (displayName && displayName !== previousDisplayName.current) {\n const newValue = nameToSlug(displayName);\n onChangeRef.current({ target: { name, value: newValue } });\n previousValue.current = newValue;\n previousDisplayName.current = displayName;\n } else if (!displayName) {\n onChangeRef.current({ target: { name, value: '' } });\n previousValue.current = '';\n previousDisplayName.current = '';\n }\n }, [displayName, name, value]);\n\n const errorMessage = error ? formatMessage({ id: error, defaultMessage: error }) : '';\n const hint = description\n ? formatMessage(\n { id: description.id, defaultMessage: description.defaultMessage },\n { ...description.values }\n )\n : '';\n const label = formatMessage(intlLabel);\n\n return (\n <Field.Root error={errorMessage} hint={hint} name={name}>\n <Field.Label>{label}</Field.Label>\n <TextInput onChange={onChange} value={value || ''} />\n <Field.Error />\n <Field.Hint />\n </Field.Root>\n );\n};\n"],"names":["SingularName","description","error","intlLabel","modifiedData","name","onChange","value","formatMessage","useIntl","onChangeRef","useRef","previousValue","previousDisplayName","displayName","useEffect","current","newValue","nameToSlug","target","errorMessage","id","defaultMessage","hint","values","label","_jsxs","Field","Root","_jsx","Label","TextInput","Error","Hint"],"mappings":";;;;;;AAmBO,MAAMA,eAAe,CAAC,EAC3BC,cAAc,IAAI,EAClBC,QAAQ,IAAI,EACZC,SAAS,EACTC,YAAY,EACZC,IAAI,EACJC,QAAQ,EACRC,KAAAA,GAAQ,IAAI,EACM,GAAA;IAClB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,cAAcC,MAAOL,CAAAA,QAAAA,CAAAA;AAC3B,IAAA,MAAMM,gBAAgBD,MAAOJ,CAAAA,KAAAA,CAAAA;IAC7B,MAAMM,mBAAAA,GAAsBF,MAAOP,CAAAA,YAAAA,EAAcU,WAAe,IAAA,EAAA,CAAA;IAChE,MAAMA,WAAAA,GAAcV,cAAcU,WAAe,IAAA,EAAA;IAEjDC,SAAU,CAAA,IAAA;AACR,QAAA,IAAID,WAAeA,IAAAA,WAAAA,KAAgBD,mBAAoBG,CAAAA,OAAO,EAAE;AAC9D,YAAA,MAAMC,WAAWC,UAAWJ,CAAAA,WAAAA,CAAAA;AAC5BJ,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEG,MAAQ,EAAA;AAAEd,oBAAAA,IAAAA;oBAAME,KAAOU,EAAAA;AAAS;AAAE,aAAA,CAAA;AACxDL,YAAAA,aAAAA,CAAcI,OAAO,GAAGC,QAAAA;AACxBJ,YAAAA,mBAAAA,CAAoBG,OAAO,GAAGF,WAAAA;SACzB,MAAA,IAAI,CAACA,WAAa,EAAA;AACvBJ,YAAAA,WAAAA,CAAYM,OAAO,CAAC;gBAAEG,MAAQ,EAAA;AAAEd,oBAAAA,IAAAA;oBAAME,KAAO,EAAA;AAAG;AAAE,aAAA,CAAA;AAClDK,YAAAA,aAAAA,CAAcI,OAAO,GAAG,EAAA;AACxBH,YAAAA,mBAAAA,CAAoBG,OAAO,GAAG,EAAA;AAChC;KACC,EAAA;AAACF,QAAAA,WAAAA;AAAaT,QAAAA,IAAAA;AAAME,QAAAA;AAAM,KAAA,CAAA;IAE7B,MAAMa,YAAAA,GAAelB,QAAQM,aAAc,CAAA;QAAEa,EAAInB,EAAAA,KAAAA;QAAOoB,cAAgBpB,EAAAA;KAAW,CAAA,GAAA,EAAA;IACnF,MAAMqB,IAAAA,GAAOtB,cACTO,aACE,CAAA;AAAEa,QAAAA,EAAAA,EAAIpB,YAAYoB,EAAE;AAAEC,QAAAA,cAAAA,EAAgBrB,YAAYqB;KAClD,EAAA;AAAE,QAAA,GAAGrB,YAAYuB;KAEnB,CAAA,GAAA,EAAA;AACJ,IAAA,MAAMC,QAAQjB,aAAcL,CAAAA,SAAAA,CAAAA;IAE5B,qBACEuB,IAAA,CAACC,MAAMC,IAAI,EAAA;QAAC1B,KAAOkB,EAAAA,YAAAA;QAAcG,IAAMA,EAAAA,IAAAA;QAAMlB,IAAMA,EAAAA,IAAAA;;AACjD,0BAAAwB,GAAA,CAACF,MAAMG,KAAK,EAAA;AAAEL,gBAAAA,QAAAA,EAAAA;;0BACdI,GAACE,CAAAA,SAAAA,EAAAA;gBAAUzB,QAAUA,EAAAA,QAAAA;AAAUC,gBAAAA,KAAAA,EAAOA,KAAS,IAAA;;AAC/C,0BAAAsB,GAAA,CAACF,MAAMK,KAAK,EAAA,EAAA,CAAA;AACZ,0BAAAH,GAAA,CAACF,MAAMM,IAAI,EAAA,EAAA;;;AAGjB;;;;"}
@@ -12,6 +12,7 @@ const reservedAttributes = [
12
12
  'created_at',
13
13
  'updated_at',
14
14
  'published_at',
15
+ // V6: we will need to add first_published_at when it becomes the default behaviour
15
16
  'created_by_id',
16
17
  'updated_by_id',
17
18
  // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sources":["../../../server/src/services/builder.ts"],"sourcesContent":["import { snakeCase } from 'lodash/fp';\n\n// use snake_case\nexport const reservedAttributes = [\n // TODO: these need to come from a centralized place so we don't break things accidentally in the future and can share them outside the CTB, for example on Strapi bootstrap prior to schema db sync\n\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'status',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n// use snake_case\nexport const reservedModels = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nexport const getReservedNames = () => {\n return {\n models: reservedModels,\n attributes: reservedAttributes,\n };\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedModelName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedModels.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedModels\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedAttributeName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedAttributes.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedAttributes\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n"],"names":["reservedAttributes","reservedModels","getReservedNames","models","attributes","isReservedModelName","name","snakeCaseName","snakeCase","includes","filter","key","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName"],"mappings":";;;;AAEA;MACaA,kBAAqB,GAAA;;;AAIhC,IAAA,IAAA;AACA,IAAA,aAAA;;AAGA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;AACA,IAAA,eAAA;AACA,IAAA,eAAA;;AAEA,IAAA,YAAA;AACA,IAAA,YAAA;;AAGA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;AAGF;MACaC,cAAiB,GAAA;AAC5B,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;MAGWC,gBAAmB,GAAA,IAAA;IAC9B,OAAO;QACLC,MAAQF,EAAAA,cAAAA;QACRG,UAAYJ,EAAAA;AACd,KAAA;AACF;AAEA;AACO,MAAMK,sBAAsB,CAACC,IAAAA,GAAAA;AAClC,IAAA,MAAMC,gBAAgBC,YAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIL,cAAAA,CAAeQ,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC1C,OAAO,IAAA;AACT;IAEA,IACEN,cAAAA,CACGS,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;AAEA;AACO,MAAME,0BAA0B,CAACZ,IAAAA,GAAAA;AACtC,IAAA,MAAMC,gBAAgBC,YAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIN,kBAAAA,CAAmBS,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC9C,OAAO,IAAA;AACT;IAEA,IACEP,kBAAAA,CACGU,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;;;;;;;;"}
1
+ {"version":3,"file":"builder.js","sources":["../../../server/src/services/builder.ts"],"sourcesContent":["import { snakeCase } from 'lodash/fp';\n\n// use snake_case\nexport const reservedAttributes = [\n // TODO: these need to come from a centralized place so we don't break things accidentally in the future and can share them outside the CTB, for example on Strapi bootstrap prior to schema db sync\n\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'status',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n// use snake_case\nexport const reservedModels = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nexport const getReservedNames = () => {\n return {\n models: reservedModels,\n attributes: reservedAttributes,\n };\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedModelName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedModels.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedModels\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedAttributeName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedAttributes.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedAttributes\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n"],"names":["reservedAttributes","reservedModels","getReservedNames","models","attributes","isReservedModelName","name","snakeCaseName","snakeCase","includes","filter","key","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName"],"mappings":";;;;AAEA;MACaA,kBAAqB,GAAA;;;AAIhC,IAAA,IAAA;AACA,IAAA,aAAA;;AAGA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;;AAEA,IAAA,eAAA;AACA,IAAA,eAAA;;AAEA,IAAA,YAAA;AACA,IAAA,YAAA;;AAGA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;AAGF;MACaC,cAAiB,GAAA;AAC5B,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;MAGWC,gBAAmB,GAAA,IAAA;IAC9B,OAAO;QACLC,MAAQF,EAAAA,cAAAA;QACRG,UAAYJ,EAAAA;AACd,KAAA;AACF;AAEA;AACO,MAAMK,sBAAsB,CAACC,IAAAA,GAAAA;AAClC,IAAA,MAAMC,gBAAgBC,YAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIL,cAAAA,CAAeQ,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC1C,OAAO,IAAA;AACT;IAEA,IACEN,cAAAA,CACGS,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;AAEA;AACO,MAAME,0BAA0B,CAACZ,IAAAA,GAAAA;AACtC,IAAA,MAAMC,gBAAgBC,YAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIN,kBAAAA,CAAmBS,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC9C,OAAO,IAAA;AACT;IAEA,IACEP,kBAAAA,CACGU,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;;;;;;;;"}
@@ -10,6 +10,7 @@ const reservedAttributes = [
10
10
  'created_at',
11
11
  'updated_at',
12
12
  'published_at',
13
+ // V6: we will need to add first_published_at when it becomes the default behaviour
13
14
  'created_by_id',
14
15
  'updated_by_id',
15
16
  // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion
@@ -1 +1 @@
1
- {"version":3,"file":"builder.mjs","sources":["../../../server/src/services/builder.ts"],"sourcesContent":["import { snakeCase } from 'lodash/fp';\n\n// use snake_case\nexport const reservedAttributes = [\n // TODO: these need to come from a centralized place so we don't break things accidentally in the future and can share them outside the CTB, for example on Strapi bootstrap prior to schema db sync\n\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'status',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n// use snake_case\nexport const reservedModels = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nexport const getReservedNames = () => {\n return {\n models: reservedModels,\n attributes: reservedAttributes,\n };\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedModelName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedModels.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedModels\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedAttributeName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedAttributes.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedAttributes\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n"],"names":["reservedAttributes","reservedModels","getReservedNames","models","attributes","isReservedModelName","name","snakeCaseName","snakeCase","includes","filter","key","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName"],"mappings":";;AAEA;MACaA,kBAAqB,GAAA;;;AAIhC,IAAA,IAAA;AACA,IAAA,aAAA;;AAGA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;AACA,IAAA,eAAA;AACA,IAAA,eAAA;;AAEA,IAAA,YAAA;AACA,IAAA,YAAA;;AAGA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;AAGF;MACaC,cAAiB,GAAA;AAC5B,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;MAGWC,gBAAmB,GAAA,IAAA;IAC9B,OAAO;QACLC,MAAQF,EAAAA,cAAAA;QACRG,UAAYJ,EAAAA;AACd,KAAA;AACF;AAEA;AACO,MAAMK,sBAAsB,CAACC,IAAAA,GAAAA;AAClC,IAAA,MAAMC,gBAAgBC,SAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIL,cAAAA,CAAeQ,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC1C,OAAO,IAAA;AACT;IAEA,IACEN,cAAAA,CACGS,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;AAEA;AACO,MAAME,0BAA0B,CAACZ,IAAAA,GAAAA;AACtC,IAAA,MAAMC,gBAAgBC,SAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIN,kBAAAA,CAAmBS,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC9C,OAAO,IAAA;AACT;IAEA,IACEP,kBAAAA,CACGU,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;;;;"}
1
+ {"version":3,"file":"builder.mjs","sources":["../../../server/src/services/builder.ts"],"sourcesContent":["import { snakeCase } from 'lodash/fp';\n\n// use snake_case\nexport const reservedAttributes = [\n // TODO: these need to come from a centralized place so we don't break things accidentally in the future and can share them outside the CTB, for example on Strapi bootstrap prior to schema db sync\n\n // ID fields\n 'id',\n 'document_id',\n\n // Creator fields\n 'created_at',\n 'updated_at',\n 'published_at',\n // V6: we will need to add first_published_at when it becomes the default behaviour\n 'created_by_id',\n 'updated_by_id',\n // does not actually conflict because the fields are called *_by_id but we'll leave it to avoid confusion\n 'created_by',\n 'updated_by',\n\n // Used for Strapi functionality\n 'entry_id',\n 'status',\n 'localizations',\n 'meta',\n 'locale',\n '__component',\n '__contentType',\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\n// use snake_case\nexport const reservedModels = [\n 'boolean',\n 'date',\n 'date_time',\n 'time',\n 'upload',\n 'document',\n 'then', // no longer an issue but still restricting for being a javascript keyword\n\n // We support ending with * to denote prefixes\n 'strapi*',\n '_strapi*',\n '__strapi*',\n];\n\nexport const getReservedNames = () => {\n return {\n models: reservedModels,\n attributes: reservedAttributes,\n };\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedModelName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedModels.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedModels\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n\n// compare snake case to check the actual column names that will be used in the database\nexport const isReservedAttributeName = (name: string) => {\n const snakeCaseName = snakeCase(name);\n if (reservedAttributes.includes(snakeCaseName)) {\n return true;\n }\n\n if (\n reservedAttributes\n .filter((key) => key.endsWith('*'))\n .map((key) => key.slice(0, -1))\n .some((prefix) => snakeCaseName.startsWith(prefix))\n ) {\n return true;\n }\n\n return false;\n};\n"],"names":["reservedAttributes","reservedModels","getReservedNames","models","attributes","isReservedModelName","name","snakeCaseName","snakeCase","includes","filter","key","endsWith","map","slice","some","prefix","startsWith","isReservedAttributeName"],"mappings":";;AAEA;MACaA,kBAAqB,GAAA;;;AAIhC,IAAA,IAAA;AACA,IAAA,aAAA;;AAGA,IAAA,YAAA;AACA,IAAA,YAAA;AACA,IAAA,cAAA;;AAEA,IAAA,eAAA;AACA,IAAA,eAAA;;AAEA,IAAA,YAAA;AACA,IAAA,YAAA;;AAGA,IAAA,UAAA;AACA,IAAA,QAAA;AACA,IAAA,eAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,aAAA;AACA,IAAA,eAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;AAGF;MACaC,cAAiB,GAAA;AAC5B,IAAA,SAAA;AACA,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA,QAAA;AACA,IAAA,UAAA;AACA,IAAA,MAAA;;AAGA,IAAA,SAAA;AACA,IAAA,UAAA;AACA,IAAA;;MAGWC,gBAAmB,GAAA,IAAA;IAC9B,OAAO;QACLC,MAAQF,EAAAA,cAAAA;QACRG,UAAYJ,EAAAA;AACd,KAAA;AACF;AAEA;AACO,MAAMK,sBAAsB,CAACC,IAAAA,GAAAA;AAClC,IAAA,MAAMC,gBAAgBC,SAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIL,cAAAA,CAAeQ,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC1C,OAAO,IAAA;AACT;IAEA,IACEN,cAAAA,CACGS,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;AAEA;AACO,MAAME,0BAA0B,CAACZ,IAAAA,GAAAA;AACtC,IAAA,MAAMC,gBAAgBC,SAAUF,CAAAA,IAAAA,CAAAA;IAChC,IAAIN,kBAAAA,CAAmBS,QAAQ,CAACF,aAAgB,CAAA,EAAA;QAC9C,OAAO,IAAA;AACT;IAEA,IACEP,kBAAAA,CACGU,MAAM,CAAC,CAACC,GAAAA,GAAQA,GAAIC,CAAAA,QAAQ,CAAC,GAAA,CAAA,CAAA,CAC7BC,GAAG,CAAC,CAACF,GAAAA,GAAQA,IAAIG,KAAK,CAAC,CAAG,EAAA,CAAC,CAC3BC,CAAAA,CAAAA,CAAAA,IAAI,CAAC,CAACC,MAAWT,GAAAA,aAAAA,CAAcU,UAAU,CAACD,MAC7C,CAAA,CAAA,EAAA;QACA,OAAO,IAAA;AACT;IAEA,OAAO,KAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../server/src/services/builder.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,UA8B9B,CAAC;AAGF,eAAO,MAAM,cAAc,UAa1B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;CAK5B,CAAC;AAGF,eAAO,MAAM,mBAAmB,SAAU,MAAM,YAgB/C,CAAC;AAGF,eAAO,MAAM,uBAAuB,SAAU,MAAM,YAgBnD,CAAC"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../../../../server/src/services/builder.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,kBAAkB,UA+B9B,CAAC;AAGF,eAAO,MAAM,cAAc,UAa1B,CAAC;AAEF,eAAO,MAAM,gBAAgB;;;CAK5B,CAAC;AAGF,eAAO,MAAM,mBAAmB,SAAU,MAAM,YAgB/C,CAAC;AAGF,eAAO,MAAM,uBAAuB,SAAU,MAAM,YAgBnD,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@strapi/content-type-builder",
3
- "version": "5.20.0",
3
+ "version": "5.21.0",
4
4
  "description": "Create and manage content types",
5
5
  "repository": {
6
6
  "type": "git",
@@ -67,9 +67,9 @@
67
67
  "@reduxjs/toolkit": "1.9.7",
68
68
  "@sindresorhus/slugify": "1.1.0",
69
69
  "@strapi/design-system": "2.0.0-rc.29",
70
- "@strapi/generators": "5.20.0",
70
+ "@strapi/generators": "5.21.0",
71
71
  "@strapi/icons": "2.0.0-rc.29",
72
- "@strapi/utils": "5.20.0",
72
+ "@strapi/utils": "5.21.0",
73
73
  "date-fns": "2.30.0",
74
74
  "fs-extra": "11.2.0",
75
75
  "immer": "9.0.21",
@@ -82,8 +82,8 @@
82
82
  "zod": "3.25.67"
83
83
  },
84
84
  "devDependencies": {
85
- "@strapi/admin": "5.20.0",
86
- "@strapi/types": "5.20.0",
85
+ "@strapi/admin": "5.21.0",
86
+ "@strapi/types": "5.21.0",
87
87
  "@testing-library/dom": "10.1.0",
88
88
  "@testing-library/react": "15.0.7",
89
89
  "@testing-library/user-event": "14.5.2",