@strapi/content-manager 5.48.0 → 5.48.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/dist/admin/features/DocumentRBAC.js +9 -1
  2. package/dist/admin/features/DocumentRBAC.js.map +1 -1
  3. package/dist/admin/features/DocumentRBAC.mjs +9 -1
  4. package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
  5. package/dist/admin/hooks/useContentTypeSchema.js +37 -17
  6. package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
  7. package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
  8. package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocumentLayout.js +43 -4
  10. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  11. package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
  12. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  13. package/dist/admin/pages/ComponentConfigurationPage.js +6 -3
  14. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  15. package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
  16. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  17. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +5 -2
  18. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +11 -2
  22. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
  24. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +9 -4
  26. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
  28. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +2 -26
  30. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
  32. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +72 -0
  34. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
  35. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
  36. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
  37. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +4 -8
  38. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
  39. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
  40. package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
  41. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +6 -10
  42. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  43. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
  44. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  45. package/dist/admin/pages/ListView/components/Filters.js +7 -9
  46. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  47. package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
  48. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  49. package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
  50. package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
  51. package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
  52. package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
  53. package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
  54. package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
  55. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
  56. package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
  57. package/dist/admin/services/components.js +3 -2
  58. package/dist/admin/services/components.js.map +1 -1
  59. package/dist/admin/services/components.mjs +3 -2
  60. package/dist/admin/services/components.mjs.map +1 -1
  61. package/dist/admin/services/contentTypes.js +4 -3
  62. package/dist/admin/services/contentTypes.js.map +1 -1
  63. package/dist/admin/services/contentTypes.mjs +4 -3
  64. package/dist/admin/services/contentTypes.mjs.map +1 -1
  65. package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
  66. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
  67. package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
  68. package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
  69. package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
  70. package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
  71. package/dist/admin/translations/en.json.js +1 -0
  72. package/dist/admin/translations/en.json.js.map +1 -1
  73. package/dist/admin/translations/en.json.mjs +1 -0
  74. package/dist/admin/translations/en.json.mjs.map +1 -1
  75. package/dist/admin/utils/attributes.js +17 -2
  76. package/dist/admin/utils/attributes.js.map +1 -1
  77. package/dist/admin/utils/attributes.mjs +17 -2
  78. package/dist/admin/utils/attributes.mjs.map +1 -1
  79. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
  80. package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
  81. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
  82. package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
  83. package/dist/server/controllers/collection-types.js +7 -2
  84. package/dist/server/controllers/collection-types.js.map +1 -1
  85. package/dist/server/controllers/collection-types.mjs +7 -2
  86. package/dist/server/controllers/collection-types.mjs.map +1 -1
  87. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  88. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentLayout.js","sources":["../../../admin/src/hooks/useDocumentLayout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport {\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\n\nimport { HOOKS } from '../constants/hooks';\nimport { useGetContentTypeConfigurationQuery } from '../services/contentTypes';\nimport { BaseQueryError } from '../utils/api';\nimport { getMainField } from '../utils/attributes';\n\nimport { useContentTypeSchema } from './useContentTypeSchema';\nimport {\n type ComponentsDictionary,\n type Document,\n type Schema,\n useDoc,\n useDocument,\n} from './useDocument';\n\nimport type { ComponentConfiguration } from '../../../shared/contracts/components';\nimport type {\n Metadatas,\n FindContentTypeConfiguration,\n Settings,\n} from '../../../shared/contracts/content-types';\nimport type { Filters, InputProps, Table } from '@strapi/admin/strapi-admin';\nimport type { Schema as SchemaUtils } from '@strapi/types';\n\ntype LayoutOptions = Schema['options'] & Schema['pluginOptions'] & object;\n\ninterface LayoutSettings extends Settings {\n displayName?: string;\n icon?: never;\n}\n\ninterface ListFieldLayout\n extends Table.Header<Document, ListFieldLayout>,\n Pick<Filters.Filter, 'mainField'> {\n attribute: SchemaUtils.Attribute.AnyAttribute | { type: 'custom' };\n}\n\ninterface ListLayout {\n layout: ListFieldLayout[];\n components?: never;\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['list'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\ninterface EditFieldSharedProps\n extends Omit<InputProps, 'hint' | 'label' | 'type'>,\n Pick<Filters.Filter, 'mainField'> {\n hint?: string;\n label: string;\n size: number;\n unique?: boolean;\n visible?: boolean;\n}\n\n/**\n * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type\n * is under the property attribute and the type is under the property type.\n */\ntype EditFieldLayout = {\n [K in SchemaUtils.Attribute.Kind]: EditFieldSharedProps & {\n attribute: Extract<SchemaUtils.Attribute.AnyAttribute, { type: K }>;\n type: K;\n };\n}[SchemaUtils.Attribute.Kind];\n\ninterface EditLayout {\n layout: Array<Array<EditFieldLayout[]>>;\n components: {\n [uid: string]: {\n layout: Array<EditFieldLayout[]>;\n settings: ComponentConfiguration['settings'] & {\n displayName?: string;\n icon?: string;\n };\n };\n };\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['edit'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\n\n/**\n * Data required to resolve `mainField` when converting list column names to field layouts for\n * component and relation attributes; mirrors the fourth and fifth arguments of `formatListLayout`.\n */\ntype ListViewConversionContext = {\n componentConfigurations: FindContentTypeConfiguration.Response['data']['components'];\n componentSchemas: ComponentsDictionary;\n contentTypeSchemas: Schema[];\n};\n\ntype UseDocumentLayout = (model: string) => {\n error?: BaseQueryError | SerializedError;\n isLoading: boolean;\n /**\n * This is the layout for the edit view,\n */\n edit: EditLayout;\n list: ListLayout;\n /**\n * Populated when configuration is loaded; pass into `convertListLayoutToFieldLayouts` with\n * `list.metadatas` when mapping persisted list column names (e.g. custom displayed headers).\n */\n listViewConversionContext: ListViewConversionContext | null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocumentLayout\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEFAULT_SETTINGS = {\n bulkable: false,\n filterable: false,\n searchable: false,\n pagination: false,\n defaultSortBy: '',\n defaultSortOrder: 'asc',\n mainField: 'id',\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\n/**\n * @alpha\n * @description This hook is used to get the layouts for either the edit view or list view of a specific content-type\n * including the layouts for the components used in the content-type. It also runs the mutation hook waterfall so the data\n * is consistent wherever it is used. It's a light wrapper around the `useDocument` hook, but provides the `skip` option a document\n * is not fetched, however, it does fetch the schemas & components if they do not already exist in the cache.\n *\n * If the fetch fails, it will display a notification to the user.\n *\n * @example\n * ```tsx\n * const { model } = useParams<{ model: string }>();\n * const { edit: { schema: layout } } = useDocumentLayout(model);\n *\n * return layout.map(panel => panel.map(row => row.map(field => <Field.Root {...field} />)))\n * ```\n *\n */\nconst useDocumentLayout: UseDocumentLayout = (model) => {\n const { schema, components } = useDocument({ model, collectionType: '' }, { skip: true });\n const [{ query }] = useQueryParams();\n const runHookWaterfall = useStrapiApp('useDocumentLayout', (state) => state.runHookWaterfall);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema();\n\n const {\n currentData: data,\n isLoading: isLoadingConfigs,\n error,\n } = useGetContentTypeConfigurationQuery(model);\n\n const isConfigResolvedForModel = data?.contentType?.uid === model;\n const isLoading = isLoadingSchemas || isLoadingConfigs || (!error && !isConfigResolvedForModel);\n const stableLayoutsByModelRef = React.useRef(\n new Map<\n string,\n {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext | null;\n }\n >()\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const resolvedLayouts = React.useMemo(() => {\n if (!data || isLoading) {\n return null;\n }\n\n const edit = formatEditLayout(data, { schemas, schema, components });\n const list = formatListLayout(data, { schemas, schema, components });\n const listViewConversionContext: ListViewConversionContext = {\n componentConfigurations: data.components,\n componentSchemas: components,\n contentTypeSchemas: schemas,\n };\n\n return { edit, list, listViewConversionContext };\n }, [data, isLoading, schemas, schema, components]);\n\n React.useEffect(() => {\n if (resolvedLayouts) {\n stableLayoutsByModelRef.current.set(model, resolvedLayouts);\n }\n }, [model, resolvedLayouts]);\n\n const stableLayouts = resolvedLayouts ?? stableLayoutsByModelRef.current.get(model) ?? null;\n\n const editLayout = React.useMemo(\n () =>\n stableLayouts?.edit ??\n ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [stableLayouts]\n );\n\n const listLayout = React.useMemo(\n () =>\n stableLayouts?.list ??\n ({\n layout: [],\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as ListLayout),\n [stableLayouts]\n );\n\n const { layout: edit } = React.useMemo(\n () =>\n runHookWaterfall(HOOKS.MUTATE_EDIT_VIEW_LAYOUT, {\n layout: editLayout,\n query,\n }),\n [editLayout, query, runHookWaterfall]\n );\n\n const listViewConversionContext = stableLayouts?.listViewConversionContext ?? null;\n\n return {\n error,\n isLoading,\n edit,\n list: listLayout,\n listViewConversionContext,\n } satisfies ReturnType<UseDocumentLayout>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the internal useDoc hook, as such it shouldn't be used outside of the\n * content-manager because it won't work as intended.\n */\nconst useDocLayout = () => {\n const { model } = useDoc();\n return useDocumentLayout(model);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatEditLayout\n * -----------------------------------------------------------------------------------------------*/\ntype LayoutData = FindContentTypeConfiguration.Response['data'];\n\n/**\n * @internal\n * @description takes the configuration data, the schema & the components used in the schema and formats the edit view\n * versions of the schema & components. This is then used to render the edit view of the content-type.\n */\nconst formatEditLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): EditLayout => {\n let currentPanelIndex = 0;\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const panelledEditAttributes = convertEditLayoutToFieldLayouts(\n data.contentType.layouts.edit,\n schema?.attributes,\n data.contentType.metadatas,\n { configurations: data.components, schemas: components },\n schemas\n ).reduce<Array<EditFieldLayout[][]>>((panels, row) => {\n if (row.some((field) => field.type === 'dynamiczone')) {\n panels.push([row]);\n currentPanelIndex += 2;\n } else {\n if (!panels[currentPanelIndex]) {\n panels.push([row]);\n } else {\n panels[currentPanelIndex].push(row);\n }\n }\n\n return panels;\n }, []);\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n\n // Persisted configuration can reference component UIDs absent from `/init`.\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.contentType.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: panelledEditAttributes,\n components: componentEditAttributes,\n metadatas: editMetadatas,\n settings: {\n ...data.contentType.settings,\n displayName: schema?.info?.displayName,\n },\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertEditLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the edit layout from either a content-type or a component\n * and formats it into a generic object that can be used to correctly render\n * the form fields.\n */\nconst convertEditLayoutToFieldLayouts = (\n rows: LayoutData['contentType']['layouts']['edit'],\n attributes: Schema['attributes'] = {},\n metadatas: Metadatas,\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return rows.map((row) =>\n row\n .map((field) => {\n const attribute = attributes[field.name];\n\n if (!attribute) {\n return null;\n }\n\n const fieldMetadata = metadatas[field.name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { edit: metadata } = fieldMetadata;\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n disabled: !metadata.editable,\n hint: metadata.description,\n label: metadata.label ?? '',\n name: field.name,\n // @ts-expect-error – mainField does exist on the metadata for a relation.\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n placeholder: metadata.placeholder ?? '',\n required: attribute.required ?? false,\n size: field.size,\n unique: 'unique' in attribute ? attribute.unique : false,\n visible: metadata.visible ?? true,\n type: attribute.type,\n };\n })\n .filter((field) => field !== null)\n ) as EditFieldLayout[][];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatListLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the complete configuration data, the schema & the components used in the schema and\n * formats a list view layout for the content-type. This is much simpler than the edit view layout as there\n * are less options to consider.\n */\nconst formatListLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): ListLayout => {\n const listMetadatas = Object.entries(data.contentType.metadatas).reduce<ListLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.list,\n };\n },\n {}\n );\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const listAttributes = convertListLayoutToFieldLayouts(\n data.contentType.layouts.list,\n schema?.attributes,\n listMetadatas,\n { configurations: data.components, schemas: components },\n schemas\n );\n\n return {\n layout: listAttributes,\n settings: { ...data.contentType.settings, displayName: schema?.info?.displayName },\n metadatas: listMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertListLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the columns from the list view configuration and formats them into a generic object\n * combinining metadata and attribute data.\n *\n * @note We do use this to reformat the list of strings when updating the displayed headers for the list view.\n */\nconst convertListLayoutToFieldLayouts = (\n columns: LayoutData['contentType']['layouts']['list'],\n attributes: Schema['attributes'] = {},\n metadatas: ListLayout['metadatas'],\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return columns\n .map((name) => {\n const attribute = attributes[name];\n\n if (!attribute) {\n return null;\n }\n\n const metadata = metadatas[name];\n if (!metadata) {\n return null;\n }\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n label: metadata.label ?? '',\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n name: name,\n searchable: metadata.searchable ?? true,\n sortable: metadata.sortable ?? true,\n } satisfies ListFieldLayout;\n })\n .filter((field) => field !== null) as ListFieldLayout[];\n};\n\nexport {\n useDocLayout,\n useDocumentLayout,\n convertListLayoutToFieldLayouts,\n convertEditLayoutToFieldLayouts,\n DEFAULT_SETTINGS,\n};\nexport type { EditLayout, EditFieldLayout, ListLayout, ListFieldLayout, UseDocumentLayout };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pagination","defaultSortBy","defaultSortOrder","mainField","pageSize","relationOpenMode","useDocumentLayout","model","schema","components","useDocument","collectionType","skip","query","useQueryParams","runHookWaterfall","useStrapiApp","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","isLoading","isLoadingSchemas","schemas","useContentTypeSchema","currentData","data","isLoadingConfigs","error","useGetContentTypeConfigurationQuery","isConfigResolvedForModel","contentType","uid","stableLayoutsByModelRef","React","useRef","Map","useEffect","type","message","resolvedLayouts","useMemo","edit","formatEditLayout","list","formatListLayout","listViewConversionContext","componentConfigurations","componentSchemas","contentTypeSchemas","current","set","stableLayouts","get","editLayout","layout","metadatas","options","settings","listLayout","HOOKS","MUTATE_EDIT_VIEW_LAYOUT","useDocLayout","useDoc","currentPanelIndex","panelledEditAttributes","convertEditLayoutToFieldLayouts","layouts","attributes","configurations","reduce","panels","row","some","field","push","componentEditAttributes","Object","entries","acc","configuration","componentSchema","icon","info","displayName","editMetadatas","attribute","metadata","pluginOptions","rows","map","name","fieldMetadata","component","disabled","editable","hint","description","label","getMainField","placeholder","required","size","unique","visible","filter","listMetadatas","listAttributes","convertListLayoutToFieldLayouts","columns","sortable"],"mappings":"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"}
1
+ {"version":3,"file":"useDocumentLayout.js","sources":["../../../admin/src/hooks/useDocumentLayout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport {\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\n\nimport { HOOKS } from '../constants/hooks';\nimport { useGetContentTypeConfigurationQuery } from '../services/contentTypes';\nimport { BaseQueryError } from '../utils/api';\nimport { getMainField } from '../utils/attributes';\nimport { normalizeContentManagerLayout } from '../utils/layouts/normalizeContentManagerLayout';\n\nimport { useContentTypeSchema } from './useContentTypeSchema';\nimport {\n type ComponentsDictionary,\n type Document,\n type Schema,\n useDoc,\n useDocument,\n} from './useDocument';\n\nimport type { ComponentConfiguration } from '../../../shared/contracts/components';\nimport type {\n Metadatas,\n FindContentTypeConfiguration,\n Settings,\n} from '../../../shared/contracts/content-types';\nimport type { Filters, InputProps, Table } from '@strapi/admin/strapi-admin';\nimport type { Schema as SchemaUtils } from '@strapi/types';\n\ntype LayoutOptions = Schema['options'] & Schema['pluginOptions'] & object;\n\ninterface LayoutSettings extends Settings {\n displayName?: string;\n icon?: never;\n}\n\ninterface ListFieldLayout\n extends Table.Header<Document, ListFieldLayout>,\n Pick<Filters.Filter, 'mainField'> {\n attribute: SchemaUtils.Attribute.AnyAttribute | { type: 'custom' };\n}\n\ninterface ListLayout {\n layout: ListFieldLayout[];\n components?: never;\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['list'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\ninterface EditFieldSharedProps\n extends Omit<InputProps, 'hint' | 'label' | 'type'>,\n Pick<Filters.Filter, 'mainField'> {\n hint?: string;\n label: string;\n size: number;\n unique?: boolean;\n visible?: boolean;\n}\n\n/**\n * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type\n * is under the property attribute and the type is under the property type.\n */\ntype EditFieldLayout = {\n [K in SchemaUtils.Attribute.Kind]: EditFieldSharedProps & {\n attribute: Extract<SchemaUtils.Attribute.AnyAttribute, { type: K }>;\n type: K;\n };\n}[SchemaUtils.Attribute.Kind];\n\ninterface EditLayout {\n layout: Array<Array<EditFieldLayout[]>>;\n components: {\n [uid: string]: {\n layout: Array<EditFieldLayout[]>;\n settings: ComponentConfiguration['settings'] & {\n displayName?: string;\n icon?: string;\n };\n };\n };\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['edit'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\n\n/**\n * Data required to resolve `mainField` when converting list column names to field layouts for\n * component and relation attributes; mirrors the fourth and fifth arguments of `formatListLayout`.\n */\ntype ListViewConversionContext = {\n componentConfigurations: FindContentTypeConfiguration.Response['data']['components'];\n componentSchemas: ComponentsDictionary;\n contentTypeSchemas: Schema[];\n};\n\ntype UseDocumentLayout = (model: string) => {\n error?: BaseQueryError | SerializedError;\n isLoading: boolean;\n /**\n * This is the layout for the edit view,\n */\n edit: EditLayout;\n list: ListLayout;\n /**\n * Populated when configuration is loaded; pass into `convertListLayoutToFieldLayouts` with\n * `list.metadatas` when mapping persisted list column names (e.g. custom displayed headers).\n */\n listViewConversionContext: ListViewConversionContext | null;\n};\n\ntype ResolvedLayouts = {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext;\n};\n\ntype ResolvedLayoutCacheEntry = {\n components: ComponentsDictionary;\n data: LayoutData;\n model: string;\n schema?: Schema;\n schemas: Schema[];\n value: ResolvedLayouts;\n};\n\nconst RESOLVED_LAYOUT_CACHE_LIMIT = 25;\n// Module-level cache keeps resolved layout object identities stable across hook instances\n// when RTK Query returns the same schema/configuration references.\nconst resolvedLayoutCache: ResolvedLayoutCacheEntry[] = [];\n\nconst getCachedResolvedLayouts = ({\n components,\n data,\n model,\n schema,\n schemas,\n}: Omit<ResolvedLayoutCacheEntry, 'value'>) => {\n return resolvedLayoutCache.find(\n (entry) =>\n entry.components === components &&\n entry.data === data &&\n entry.model === model &&\n entry.schema === schema &&\n entry.schemas === schemas\n )?.value;\n};\n\nconst setCachedResolvedLayouts = (entry: ResolvedLayoutCacheEntry) => {\n resolvedLayoutCache.unshift(entry);\n\n if (resolvedLayoutCache.length > RESOLVED_LAYOUT_CACHE_LIMIT) {\n resolvedLayoutCache.pop();\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocumentLayout\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEFAULT_SETTINGS = {\n bulkable: false,\n filterable: false,\n searchable: false,\n pagination: false,\n defaultSortBy: '',\n defaultSortOrder: 'asc',\n mainField: 'id',\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\n/**\n * @alpha\n * @description This hook is used to get the layouts for either the edit view or list view of a specific content-type\n * including the layouts for the components used in the content-type. It also runs the mutation hook waterfall so the data\n * is consistent wherever it is used. It's a light wrapper around the `useDocument` hook, but provides the `skip` option a document\n * is not fetched, however, it does fetch the schemas & components if they do not already exist in the cache.\n *\n * If the fetch fails, it will display a notification to the user.\n *\n * @example\n * ```tsx\n * const { model } = useParams<{ model: string }>();\n * const { edit: { schema: layout } } = useDocumentLayout(model);\n *\n * return layout.map(panel => panel.map(row => row.map(field => <Field.Root {...field} />)))\n * ```\n *\n */\nconst useDocumentLayout: UseDocumentLayout = (model) => {\n const { schema, components } = useDocument({ model, collectionType: '' }, { skip: true });\n const [{ query }] = useQueryParams();\n const runHookWaterfall = useStrapiApp('useDocumentLayout', (state) => state.runHookWaterfall);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema();\n\n const {\n currentData: data,\n isLoading: isLoadingConfigs,\n error,\n } = useGetContentTypeConfigurationQuery(model);\n\n const isConfigResolvedForModel = data?.contentType?.uid === model;\n const isLoading = isLoadingSchemas || isLoadingConfigs || (!error && !isConfigResolvedForModel);\n const stableLayoutsByModelRef = React.useRef(\n new Map<\n string,\n {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext | null;\n }\n >()\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const resolvedLayouts = React.useMemo(() => {\n if (!data || isLoading) {\n return null;\n }\n\n const cachedLayouts = getCachedResolvedLayouts({ components, data, model, schema, schemas });\n\n if (cachedLayouts) {\n return cachedLayouts;\n }\n\n const normalizedData = normalizeContentManagerLayout(data, { schemas, schema, components });\n const edit = formatEditLayout(normalizedData, { schemas, schema, components });\n const list = formatListLayout(normalizedData, { schemas, schema, components });\n const listViewConversionContext: ListViewConversionContext = {\n componentConfigurations: normalizedData.components,\n componentSchemas: components,\n contentTypeSchemas: schemas,\n };\n\n const layouts = { edit, list, listViewConversionContext };\n\n setCachedResolvedLayouts({ components, data, model, schema, schemas, value: layouts });\n\n return layouts;\n }, [data, isLoading, model, schemas, schema, components]);\n\n React.useEffect(() => {\n if (resolvedLayouts) {\n stableLayoutsByModelRef.current.set(model, resolvedLayouts);\n }\n }, [model, resolvedLayouts]);\n\n const stableLayouts = resolvedLayouts ?? stableLayoutsByModelRef.current.get(model) ?? null;\n\n const editLayout = React.useMemo(\n () =>\n stableLayouts?.edit ??\n ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [stableLayouts]\n );\n\n const listLayout = React.useMemo(\n () =>\n stableLayouts?.list ??\n ({\n layout: [],\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as ListLayout),\n [stableLayouts]\n );\n\n const { layout: edit } = React.useMemo(\n () =>\n runHookWaterfall(HOOKS.MUTATE_EDIT_VIEW_LAYOUT, {\n layout: editLayout,\n query,\n }),\n [editLayout, query, runHookWaterfall]\n );\n\n const listViewConversionContext = stableLayouts?.listViewConversionContext ?? null;\n\n return {\n error,\n isLoading,\n edit,\n list: listLayout,\n listViewConversionContext,\n } satisfies ReturnType<UseDocumentLayout>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the internal useDoc hook, as such it shouldn't be used outside of the\n * content-manager because it won't work as intended.\n */\nconst useDocLayout = () => {\n const { model } = useDoc();\n return useDocumentLayout(model);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatEditLayout\n * -----------------------------------------------------------------------------------------------*/\ntype LayoutData = FindContentTypeConfiguration.Response['data'];\n\n/**\n * @internal\n * @description takes the configuration data, the schema & the components used in the schema and formats the edit view\n * versions of the schema & components. This is then used to render the edit view of the content-type.\n */\nconst formatEditLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): EditLayout => {\n let currentPanelIndex = 0;\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const panelledEditAttributes = convertEditLayoutToFieldLayouts(\n data.contentType.layouts.edit,\n schema?.attributes,\n data.contentType.metadatas,\n { configurations: data.components, schemas: components },\n schemas\n ).reduce<Array<EditFieldLayout[][]>>((panels, row) => {\n if (row.some((field) => field.type === 'dynamiczone')) {\n panels.push([row]);\n currentPanelIndex += 2;\n } else {\n if (!panels[currentPanelIndex]) {\n panels.push([row]);\n } else {\n panels[currentPanelIndex].push(row);\n }\n }\n\n return panels;\n }, []);\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n\n // Persisted configuration can reference component UIDs absent from `/init`.\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.contentType.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: panelledEditAttributes,\n components: componentEditAttributes,\n metadatas: editMetadatas,\n settings: {\n ...data.contentType.settings,\n displayName: schema?.info?.displayName,\n },\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertEditLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the edit layout from either a content-type or a component\n * and formats it into a generic object that can be used to correctly render\n * the form fields.\n */\nconst convertEditLayoutToFieldLayouts = (\n rows: LayoutData['contentType']['layouts']['edit'],\n attributes: Schema['attributes'] = {},\n metadatas: Metadatas,\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return rows.map((row) =>\n row\n .map((field) => {\n const attribute = attributes[field.name];\n\n if (!attribute) {\n return null;\n }\n\n const fieldMetadata = metadatas[field.name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { edit: metadata } = fieldMetadata;\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n disabled: !metadata.editable,\n hint: metadata.description,\n label: metadata.label ?? '',\n name: field.name,\n // @ts-expect-error – mainField does exist on the metadata for a relation.\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n placeholder: metadata.placeholder ?? '',\n required: attribute.required ?? false,\n size: field.size,\n unique: 'unique' in attribute ? attribute.unique : false,\n visible: metadata.visible ?? true,\n type: attribute.type,\n };\n })\n .filter((field) => field !== null)\n ) as EditFieldLayout[][];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatListLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the complete configuration data, the schema & the components used in the schema and\n * formats a list view layout for the content-type. This is much simpler than the edit view layout as there\n * are less options to consider.\n */\nconst formatListLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): ListLayout => {\n const listMetadatas = Object.entries(data.contentType.metadatas).reduce<ListLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.list,\n };\n },\n {}\n );\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const listAttributes = convertListLayoutToFieldLayouts(\n data.contentType.layouts.list,\n schema?.attributes,\n listMetadatas,\n { configurations: data.components, schemas: components },\n schemas\n );\n\n return {\n layout: listAttributes,\n settings: { ...data.contentType.settings, displayName: schema?.info?.displayName },\n metadatas: listMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertListLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the columns from the list view configuration and formats them into a generic object\n * combinining metadata and attribute data.\n *\n * @note We do use this to reformat the list of strings when updating the displayed headers for the list view.\n */\nconst convertListLayoutToFieldLayouts = (\n columns: LayoutData['contentType']['layouts']['list'],\n attributes: Schema['attributes'] = {},\n metadatas: ListLayout['metadatas'],\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return columns\n .map((name) => {\n const attribute = attributes[name];\n\n if (!attribute) {\n return null;\n }\n\n const metadata = metadatas[name];\n if (!metadata) {\n return null;\n }\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n label: metadata.label ?? '',\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n name: name,\n searchable: metadata.searchable ?? true,\n sortable: metadata.sortable ?? true,\n } satisfies ListFieldLayout;\n })\n .filter((field) => field !== null) as ListFieldLayout[];\n};\n\nexport {\n useDocLayout,\n useDocumentLayout,\n convertListLayoutToFieldLayouts,\n convertEditLayoutToFieldLayouts,\n DEFAULT_SETTINGS,\n};\nexport type { EditLayout, EditFieldLayout, ListLayout, ListFieldLayout, UseDocumentLayout };\n"],"names":["RESOLVED_LAYOUT_CACHE_LIMIT","resolvedLayoutCache","getCachedResolvedLayouts","components","data","model","schema","schemas","find","entry","value","setCachedResolvedLayouts","unshift","length","pop","DEFAULT_SETTINGS","bulkable","filterable","searchable","pagination","defaultSortBy","defaultSortOrder","mainField","pageSize","relationOpenMode","useDocumentLayout","useDocument","collectionType","skip","query","useQueryParams","runHookWaterfall","useStrapiApp","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","isLoading","isLoadingSchemas","useContentTypeSchema","currentData","isLoadingConfigs","error","useGetContentTypeConfigurationQuery","isConfigResolvedForModel","contentType","uid","stableLayoutsByModelRef","React","useRef","Map","useEffect","type","message","resolvedLayouts","useMemo","cachedLayouts","normalizedData","normalizeContentManagerLayout","edit","formatEditLayout","list","formatListLayout","listViewConversionContext","componentConfigurations","componentSchemas","contentTypeSchemas","layouts","current","set","stableLayouts","get","editLayout","layout","metadatas","options","settings","listLayout","HOOKS","MUTATE_EDIT_VIEW_LAYOUT","useDocLayout","useDoc","currentPanelIndex","panelledEditAttributes","convertEditLayoutToFieldLayouts","attributes","configurations","reduce","panels","row","some","field","push","componentEditAttributes","Object","entries","acc","configuration","componentSchema","icon","info","displayName","editMetadatas","attribute","metadata","pluginOptions","rows","map","name","fieldMetadata","component","disabled","editable","hint","description","label","getMainField","placeholder","required","size","unique","visible","filter","listMetadatas","listAttributes","convertListLayoutToFieldLayouts","columns","sortable"],"mappings":"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"}
@@ -3,9 +3,23 @@ import { useQueryParams, useStrapiApp, useNotification, useAPIErrorHandler } fro
3
3
  import { HOOKS } from '../constants/hooks.mjs';
4
4
  import { useGetContentTypeConfigurationQuery } from '../services/contentTypes.mjs';
5
5
  import { getMainField } from '../utils/attributes.mjs';
6
+ import { normalizeContentManagerLayout } from '../utils/layouts/normalizeContentManagerLayout.mjs';
6
7
  import { useContentTypeSchema } from './useContentTypeSchema.mjs';
7
8
  import { useDocument, useDoc } from './useDocument.mjs';
8
9
 
10
+ const RESOLVED_LAYOUT_CACHE_LIMIT = 25;
11
+ // Module-level cache keeps resolved layout object identities stable across hook instances
12
+ // when RTK Query returns the same schema/configuration references.
13
+ const resolvedLayoutCache = [];
14
+ const getCachedResolvedLayouts = ({ components, data, model, schema, schemas })=>{
15
+ return resolvedLayoutCache.find((entry)=>entry.components === components && entry.data === data && entry.model === model && entry.schema === schema && entry.schemas === schemas)?.value;
16
+ };
17
+ const setCachedResolvedLayouts = (entry)=>{
18
+ resolvedLayoutCache.unshift(entry);
19
+ if (resolvedLayoutCache.length > RESOLVED_LAYOUT_CACHE_LIMIT) {
20
+ resolvedLayoutCache.pop();
21
+ }
22
+ };
9
23
  /* -------------------------------------------------------------------------------------------------
10
24
  * useDocumentLayout
11
25
  * -----------------------------------------------------------------------------------------------*/ const DEFAULT_SETTINGS = {
@@ -68,29 +82,54 @@ import { useDocument, useDoc } from './useDocument.mjs';
68
82
  if (!data || isLoading) {
69
83
  return null;
70
84
  }
71
- const edit = formatEditLayout(data, {
85
+ const cachedLayouts = getCachedResolvedLayouts({
86
+ components,
87
+ data,
88
+ model,
89
+ schema,
90
+ schemas
91
+ });
92
+ if (cachedLayouts) {
93
+ return cachedLayouts;
94
+ }
95
+ const normalizedData = normalizeContentManagerLayout(data, {
96
+ schemas,
97
+ schema,
98
+ components
99
+ });
100
+ const edit = formatEditLayout(normalizedData, {
72
101
  schemas,
73
102
  schema,
74
103
  components
75
104
  });
76
- const list = formatListLayout(data, {
105
+ const list = formatListLayout(normalizedData, {
77
106
  schemas,
78
107
  schema,
79
108
  components
80
109
  });
81
110
  const listViewConversionContext = {
82
- componentConfigurations: data.components,
111
+ componentConfigurations: normalizedData.components,
83
112
  componentSchemas: components,
84
113
  contentTypeSchemas: schemas
85
114
  };
86
- return {
115
+ const layouts = {
87
116
  edit,
88
117
  list,
89
118
  listViewConversionContext
90
119
  };
120
+ setCachedResolvedLayouts({
121
+ components,
122
+ data,
123
+ model,
124
+ schema,
125
+ schemas,
126
+ value: layouts
127
+ });
128
+ return layouts;
91
129
  }, [
92
130
  data,
93
131
  isLoading,
132
+ model,
94
133
  schemas,
95
134
  schema,
96
135
  components
@@ -1 +1 @@
1
- {"version":3,"file":"useDocumentLayout.mjs","sources":["../../../admin/src/hooks/useDocumentLayout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport {\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\n\nimport { HOOKS } from '../constants/hooks';\nimport { useGetContentTypeConfigurationQuery } from '../services/contentTypes';\nimport { BaseQueryError } from '../utils/api';\nimport { getMainField } from '../utils/attributes';\n\nimport { useContentTypeSchema } from './useContentTypeSchema';\nimport {\n type ComponentsDictionary,\n type Document,\n type Schema,\n useDoc,\n useDocument,\n} from './useDocument';\n\nimport type { ComponentConfiguration } from '../../../shared/contracts/components';\nimport type {\n Metadatas,\n FindContentTypeConfiguration,\n Settings,\n} from '../../../shared/contracts/content-types';\nimport type { Filters, InputProps, Table } from '@strapi/admin/strapi-admin';\nimport type { Schema as SchemaUtils } from '@strapi/types';\n\ntype LayoutOptions = Schema['options'] & Schema['pluginOptions'] & object;\n\ninterface LayoutSettings extends Settings {\n displayName?: string;\n icon?: never;\n}\n\ninterface ListFieldLayout\n extends Table.Header<Document, ListFieldLayout>,\n Pick<Filters.Filter, 'mainField'> {\n attribute: SchemaUtils.Attribute.AnyAttribute | { type: 'custom' };\n}\n\ninterface ListLayout {\n layout: ListFieldLayout[];\n components?: never;\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['list'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\ninterface EditFieldSharedProps\n extends Omit<InputProps, 'hint' | 'label' | 'type'>,\n Pick<Filters.Filter, 'mainField'> {\n hint?: string;\n label: string;\n size: number;\n unique?: boolean;\n visible?: boolean;\n}\n\n/**\n * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type\n * is under the property attribute and the type is under the property type.\n */\ntype EditFieldLayout = {\n [K in SchemaUtils.Attribute.Kind]: EditFieldSharedProps & {\n attribute: Extract<SchemaUtils.Attribute.AnyAttribute, { type: K }>;\n type: K;\n };\n}[SchemaUtils.Attribute.Kind];\n\ninterface EditLayout {\n layout: Array<Array<EditFieldLayout[]>>;\n components: {\n [uid: string]: {\n layout: Array<EditFieldLayout[]>;\n settings: ComponentConfiguration['settings'] & {\n displayName?: string;\n icon?: string;\n };\n };\n };\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['edit'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\n\n/**\n * Data required to resolve `mainField` when converting list column names to field layouts for\n * component and relation attributes; mirrors the fourth and fifth arguments of `formatListLayout`.\n */\ntype ListViewConversionContext = {\n componentConfigurations: FindContentTypeConfiguration.Response['data']['components'];\n componentSchemas: ComponentsDictionary;\n contentTypeSchemas: Schema[];\n};\n\ntype UseDocumentLayout = (model: string) => {\n error?: BaseQueryError | SerializedError;\n isLoading: boolean;\n /**\n * This is the layout for the edit view,\n */\n edit: EditLayout;\n list: ListLayout;\n /**\n * Populated when configuration is loaded; pass into `convertListLayoutToFieldLayouts` with\n * `list.metadatas` when mapping persisted list column names (e.g. custom displayed headers).\n */\n listViewConversionContext: ListViewConversionContext | null;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocumentLayout\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEFAULT_SETTINGS = {\n bulkable: false,\n filterable: false,\n searchable: false,\n pagination: false,\n defaultSortBy: '',\n defaultSortOrder: 'asc',\n mainField: 'id',\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\n/**\n * @alpha\n * @description This hook is used to get the layouts for either the edit view or list view of a specific content-type\n * including the layouts for the components used in the content-type. It also runs the mutation hook waterfall so the data\n * is consistent wherever it is used. It's a light wrapper around the `useDocument` hook, but provides the `skip` option a document\n * is not fetched, however, it does fetch the schemas & components if they do not already exist in the cache.\n *\n * If the fetch fails, it will display a notification to the user.\n *\n * @example\n * ```tsx\n * const { model } = useParams<{ model: string }>();\n * const { edit: { schema: layout } } = useDocumentLayout(model);\n *\n * return layout.map(panel => panel.map(row => row.map(field => <Field.Root {...field} />)))\n * ```\n *\n */\nconst useDocumentLayout: UseDocumentLayout = (model) => {\n const { schema, components } = useDocument({ model, collectionType: '' }, { skip: true });\n const [{ query }] = useQueryParams();\n const runHookWaterfall = useStrapiApp('useDocumentLayout', (state) => state.runHookWaterfall);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema();\n\n const {\n currentData: data,\n isLoading: isLoadingConfigs,\n error,\n } = useGetContentTypeConfigurationQuery(model);\n\n const isConfigResolvedForModel = data?.contentType?.uid === model;\n const isLoading = isLoadingSchemas || isLoadingConfigs || (!error && !isConfigResolvedForModel);\n const stableLayoutsByModelRef = React.useRef(\n new Map<\n string,\n {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext | null;\n }\n >()\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const resolvedLayouts = React.useMemo(() => {\n if (!data || isLoading) {\n return null;\n }\n\n const edit = formatEditLayout(data, { schemas, schema, components });\n const list = formatListLayout(data, { schemas, schema, components });\n const listViewConversionContext: ListViewConversionContext = {\n componentConfigurations: data.components,\n componentSchemas: components,\n contentTypeSchemas: schemas,\n };\n\n return { edit, list, listViewConversionContext };\n }, [data, isLoading, schemas, schema, components]);\n\n React.useEffect(() => {\n if (resolvedLayouts) {\n stableLayoutsByModelRef.current.set(model, resolvedLayouts);\n }\n }, [model, resolvedLayouts]);\n\n const stableLayouts = resolvedLayouts ?? stableLayoutsByModelRef.current.get(model) ?? null;\n\n const editLayout = React.useMemo(\n () =>\n stableLayouts?.edit ??\n ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [stableLayouts]\n );\n\n const listLayout = React.useMemo(\n () =>\n stableLayouts?.list ??\n ({\n layout: [],\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as ListLayout),\n [stableLayouts]\n );\n\n const { layout: edit } = React.useMemo(\n () =>\n runHookWaterfall(HOOKS.MUTATE_EDIT_VIEW_LAYOUT, {\n layout: editLayout,\n query,\n }),\n [editLayout, query, runHookWaterfall]\n );\n\n const listViewConversionContext = stableLayouts?.listViewConversionContext ?? null;\n\n return {\n error,\n isLoading,\n edit,\n list: listLayout,\n listViewConversionContext,\n } satisfies ReturnType<UseDocumentLayout>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the internal useDoc hook, as such it shouldn't be used outside of the\n * content-manager because it won't work as intended.\n */\nconst useDocLayout = () => {\n const { model } = useDoc();\n return useDocumentLayout(model);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatEditLayout\n * -----------------------------------------------------------------------------------------------*/\ntype LayoutData = FindContentTypeConfiguration.Response['data'];\n\n/**\n * @internal\n * @description takes the configuration data, the schema & the components used in the schema and formats the edit view\n * versions of the schema & components. This is then used to render the edit view of the content-type.\n */\nconst formatEditLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): EditLayout => {\n let currentPanelIndex = 0;\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const panelledEditAttributes = convertEditLayoutToFieldLayouts(\n data.contentType.layouts.edit,\n schema?.attributes,\n data.contentType.metadatas,\n { configurations: data.components, schemas: components },\n schemas\n ).reduce<Array<EditFieldLayout[][]>>((panels, row) => {\n if (row.some((field) => field.type === 'dynamiczone')) {\n panels.push([row]);\n currentPanelIndex += 2;\n } else {\n if (!panels[currentPanelIndex]) {\n panels.push([row]);\n } else {\n panels[currentPanelIndex].push(row);\n }\n }\n\n return panels;\n }, []);\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n\n // Persisted configuration can reference component UIDs absent from `/init`.\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.contentType.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: panelledEditAttributes,\n components: componentEditAttributes,\n metadatas: editMetadatas,\n settings: {\n ...data.contentType.settings,\n displayName: schema?.info?.displayName,\n },\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertEditLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the edit layout from either a content-type or a component\n * and formats it into a generic object that can be used to correctly render\n * the form fields.\n */\nconst convertEditLayoutToFieldLayouts = (\n rows: LayoutData['contentType']['layouts']['edit'],\n attributes: Schema['attributes'] = {},\n metadatas: Metadatas,\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return rows.map((row) =>\n row\n .map((field) => {\n const attribute = attributes[field.name];\n\n if (!attribute) {\n return null;\n }\n\n const fieldMetadata = metadatas[field.name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { edit: metadata } = fieldMetadata;\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n disabled: !metadata.editable,\n hint: metadata.description,\n label: metadata.label ?? '',\n name: field.name,\n // @ts-expect-error – mainField does exist on the metadata for a relation.\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n placeholder: metadata.placeholder ?? '',\n required: attribute.required ?? false,\n size: field.size,\n unique: 'unique' in attribute ? attribute.unique : false,\n visible: metadata.visible ?? true,\n type: attribute.type,\n };\n })\n .filter((field) => field !== null)\n ) as EditFieldLayout[][];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatListLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the complete configuration data, the schema & the components used in the schema and\n * formats a list view layout for the content-type. This is much simpler than the edit view layout as there\n * are less options to consider.\n */\nconst formatListLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): ListLayout => {\n const listMetadatas = Object.entries(data.contentType.metadatas).reduce<ListLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.list,\n };\n },\n {}\n );\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const listAttributes = convertListLayoutToFieldLayouts(\n data.contentType.layouts.list,\n schema?.attributes,\n listMetadatas,\n { configurations: data.components, schemas: components },\n schemas\n );\n\n return {\n layout: listAttributes,\n settings: { ...data.contentType.settings, displayName: schema?.info?.displayName },\n metadatas: listMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertListLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the columns from the list view configuration and formats them into a generic object\n * combinining metadata and attribute data.\n *\n * @note We do use this to reformat the list of strings when updating the displayed headers for the list view.\n */\nconst convertListLayoutToFieldLayouts = (\n columns: LayoutData['contentType']['layouts']['list'],\n attributes: Schema['attributes'] = {},\n metadatas: ListLayout['metadatas'],\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return columns\n .map((name) => {\n const attribute = attributes[name];\n\n if (!attribute) {\n return null;\n }\n\n const metadata = metadatas[name];\n if (!metadata) {\n return null;\n }\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n label: metadata.label ?? '',\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n name: name,\n searchable: metadata.searchable ?? true,\n sortable: metadata.sortable ?? true,\n } satisfies ListFieldLayout;\n })\n .filter((field) => field !== null) as ListFieldLayout[];\n};\n\nexport {\n useDocLayout,\n useDocumentLayout,\n convertListLayoutToFieldLayouts,\n convertEditLayoutToFieldLayouts,\n DEFAULT_SETTINGS,\n};\nexport type { EditLayout, EditFieldLayout, ListLayout, ListFieldLayout, UseDocumentLayout };\n"],"names":["DEFAULT_SETTINGS","bulkable","filterable","searchable","pagination","defaultSortBy","defaultSortOrder","mainField","pageSize","relationOpenMode","useDocumentLayout","model","schema","components","useDocument","collectionType","skip","query","useQueryParams","runHookWaterfall","useStrapiApp","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","isLoading","isLoadingSchemas","schemas","useContentTypeSchema","currentData","data","isLoadingConfigs","error","useGetContentTypeConfigurationQuery","isConfigResolvedForModel","contentType","uid","stableLayoutsByModelRef","React","useRef","Map","useEffect","type","message","resolvedLayouts","useMemo","edit","formatEditLayout","list","formatListLayout","listViewConversionContext","componentConfigurations","componentSchemas","contentTypeSchemas","current","set","stableLayouts","get","editLayout","layout","metadatas","options","settings","listLayout","HOOKS","MUTATE_EDIT_VIEW_LAYOUT","useDocLayout","useDoc","currentPanelIndex","panelledEditAttributes","convertEditLayoutToFieldLayouts","layouts","attributes","configurations","reduce","panels","row","some","field","push","componentEditAttributes","Object","entries","acc","configuration","componentSchema","icon","info","displayName","editMetadatas","attribute","metadata","pluginOptions","rows","map","name","fieldMetadata","component","disabled","editable","hint","description","label","getMainField","placeholder","required","size","unique","visible","filter","listMetadatas","listAttributes","convertListLayoutToFieldLayouts","columns","sortable"],"mappings":"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"}
1
+ {"version":3,"file":"useDocumentLayout.mjs","sources":["../../../admin/src/hooks/useDocumentLayout.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { SerializedError } from '@reduxjs/toolkit';\nimport {\n useNotification,\n useStrapiApp,\n useAPIErrorHandler,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\n\nimport { HOOKS } from '../constants/hooks';\nimport { useGetContentTypeConfigurationQuery } from '../services/contentTypes';\nimport { BaseQueryError } from '../utils/api';\nimport { getMainField } from '../utils/attributes';\nimport { normalizeContentManagerLayout } from '../utils/layouts/normalizeContentManagerLayout';\n\nimport { useContentTypeSchema } from './useContentTypeSchema';\nimport {\n type ComponentsDictionary,\n type Document,\n type Schema,\n useDoc,\n useDocument,\n} from './useDocument';\n\nimport type { ComponentConfiguration } from '../../../shared/contracts/components';\nimport type {\n Metadatas,\n FindContentTypeConfiguration,\n Settings,\n} from '../../../shared/contracts/content-types';\nimport type { Filters, InputProps, Table } from '@strapi/admin/strapi-admin';\nimport type { Schema as SchemaUtils } from '@strapi/types';\n\ntype LayoutOptions = Schema['options'] & Schema['pluginOptions'] & object;\n\ninterface LayoutSettings extends Settings {\n displayName?: string;\n icon?: never;\n}\n\ninterface ListFieldLayout\n extends Table.Header<Document, ListFieldLayout>,\n Pick<Filters.Filter, 'mainField'> {\n attribute: SchemaUtils.Attribute.AnyAttribute | { type: 'custom' };\n}\n\ninterface ListLayout {\n layout: ListFieldLayout[];\n components?: never;\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['list'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\ninterface EditFieldSharedProps\n extends Omit<InputProps, 'hint' | 'label' | 'type'>,\n Pick<Filters.Filter, 'mainField'> {\n hint?: string;\n label: string;\n size: number;\n unique?: boolean;\n visible?: boolean;\n}\n\n/**\n * Map over all the types in Attribute Types and use that to create a union of new types where the attribute type\n * is under the property attribute and the type is under the property type.\n */\ntype EditFieldLayout = {\n [K in SchemaUtils.Attribute.Kind]: EditFieldSharedProps & {\n attribute: Extract<SchemaUtils.Attribute.AnyAttribute, { type: K }>;\n type: K;\n };\n}[SchemaUtils.Attribute.Kind];\n\ninterface EditLayout {\n layout: Array<Array<EditFieldLayout[]>>;\n components: {\n [uid: string]: {\n layout: Array<EditFieldLayout[]>;\n settings: ComponentConfiguration['settings'] & {\n displayName?: string;\n icon?: string;\n };\n };\n };\n metadatas: {\n [K in keyof Metadatas]: Metadatas[K]['edit'];\n };\n options: LayoutOptions;\n settings: LayoutSettings;\n}\n\n/**\n * Data required to resolve `mainField` when converting list column names to field layouts for\n * component and relation attributes; mirrors the fourth and fifth arguments of `formatListLayout`.\n */\ntype ListViewConversionContext = {\n componentConfigurations: FindContentTypeConfiguration.Response['data']['components'];\n componentSchemas: ComponentsDictionary;\n contentTypeSchemas: Schema[];\n};\n\ntype UseDocumentLayout = (model: string) => {\n error?: BaseQueryError | SerializedError;\n isLoading: boolean;\n /**\n * This is the layout for the edit view,\n */\n edit: EditLayout;\n list: ListLayout;\n /**\n * Populated when configuration is loaded; pass into `convertListLayoutToFieldLayouts` with\n * `list.metadatas` when mapping persisted list column names (e.g. custom displayed headers).\n */\n listViewConversionContext: ListViewConversionContext | null;\n};\n\ntype ResolvedLayouts = {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext;\n};\n\ntype ResolvedLayoutCacheEntry = {\n components: ComponentsDictionary;\n data: LayoutData;\n model: string;\n schema?: Schema;\n schemas: Schema[];\n value: ResolvedLayouts;\n};\n\nconst RESOLVED_LAYOUT_CACHE_LIMIT = 25;\n// Module-level cache keeps resolved layout object identities stable across hook instances\n// when RTK Query returns the same schema/configuration references.\nconst resolvedLayoutCache: ResolvedLayoutCacheEntry[] = [];\n\nconst getCachedResolvedLayouts = ({\n components,\n data,\n model,\n schema,\n schemas,\n}: Omit<ResolvedLayoutCacheEntry, 'value'>) => {\n return resolvedLayoutCache.find(\n (entry) =>\n entry.components === components &&\n entry.data === data &&\n entry.model === model &&\n entry.schema === schema &&\n entry.schemas === schemas\n )?.value;\n};\n\nconst setCachedResolvedLayouts = (entry: ResolvedLayoutCacheEntry) => {\n resolvedLayoutCache.unshift(entry);\n\n if (resolvedLayoutCache.length > RESOLVED_LAYOUT_CACHE_LIMIT) {\n resolvedLayoutCache.pop();\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocumentLayout\n * -----------------------------------------------------------------------------------------------*/\n\nconst DEFAULT_SETTINGS = {\n bulkable: false,\n filterable: false,\n searchable: false,\n pagination: false,\n defaultSortBy: '',\n defaultSortOrder: 'asc',\n mainField: 'id',\n pageSize: 10,\n relationOpenMode: 'modal' as const,\n};\n\n/**\n * @alpha\n * @description This hook is used to get the layouts for either the edit view or list view of a specific content-type\n * including the layouts for the components used in the content-type. It also runs the mutation hook waterfall so the data\n * is consistent wherever it is used. It's a light wrapper around the `useDocument` hook, but provides the `skip` option a document\n * is not fetched, however, it does fetch the schemas & components if they do not already exist in the cache.\n *\n * If the fetch fails, it will display a notification to the user.\n *\n * @example\n * ```tsx\n * const { model } = useParams<{ model: string }>();\n * const { edit: { schema: layout } } = useDocumentLayout(model);\n *\n * return layout.map(panel => panel.map(row => row.map(field => <Field.Root {...field} />)))\n * ```\n *\n */\nconst useDocumentLayout: UseDocumentLayout = (model) => {\n const { schema, components } = useDocument({ model, collectionType: '' }, { skip: true });\n const [{ query }] = useQueryParams();\n const runHookWaterfall = useStrapiApp('useDocumentLayout', (state) => state.runHookWaterfall);\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n const { isLoading: isLoadingSchemas, schemas } = useContentTypeSchema();\n\n const {\n currentData: data,\n isLoading: isLoadingConfigs,\n error,\n } = useGetContentTypeConfigurationQuery(model);\n\n const isConfigResolvedForModel = data?.contentType?.uid === model;\n const isLoading = isLoadingSchemas || isLoadingConfigs || (!error && !isConfigResolvedForModel);\n const stableLayoutsByModelRef = React.useRef(\n new Map<\n string,\n {\n edit: EditLayout;\n list: ListLayout;\n listViewConversionContext: ListViewConversionContext | null;\n }\n >()\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const resolvedLayouts = React.useMemo(() => {\n if (!data || isLoading) {\n return null;\n }\n\n const cachedLayouts = getCachedResolvedLayouts({ components, data, model, schema, schemas });\n\n if (cachedLayouts) {\n return cachedLayouts;\n }\n\n const normalizedData = normalizeContentManagerLayout(data, { schemas, schema, components });\n const edit = formatEditLayout(normalizedData, { schemas, schema, components });\n const list = formatListLayout(normalizedData, { schemas, schema, components });\n const listViewConversionContext: ListViewConversionContext = {\n componentConfigurations: normalizedData.components,\n componentSchemas: components,\n contentTypeSchemas: schemas,\n };\n\n const layouts = { edit, list, listViewConversionContext };\n\n setCachedResolvedLayouts({ components, data, model, schema, schemas, value: layouts });\n\n return layouts;\n }, [data, isLoading, model, schemas, schema, components]);\n\n React.useEffect(() => {\n if (resolvedLayouts) {\n stableLayoutsByModelRef.current.set(model, resolvedLayouts);\n }\n }, [model, resolvedLayouts]);\n\n const stableLayouts = resolvedLayouts ?? stableLayoutsByModelRef.current.get(model) ?? null;\n\n const editLayout = React.useMemo(\n () =>\n stableLayouts?.edit ??\n ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [stableLayouts]\n );\n\n const listLayout = React.useMemo(\n () =>\n stableLayouts?.list ??\n ({\n layout: [],\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as ListLayout),\n [stableLayouts]\n );\n\n const { layout: edit } = React.useMemo(\n () =>\n runHookWaterfall(HOOKS.MUTATE_EDIT_VIEW_LAYOUT, {\n layout: editLayout,\n query,\n }),\n [editLayout, query, runHookWaterfall]\n );\n\n const listViewConversionContext = stableLayouts?.listViewConversionContext ?? null;\n\n return {\n error,\n isLoading,\n edit,\n list: listLayout,\n listViewConversionContext,\n } satisfies ReturnType<UseDocumentLayout>;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * useDocLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal this hook uses the internal useDoc hook, as such it shouldn't be used outside of the\n * content-manager because it won't work as intended.\n */\nconst useDocLayout = () => {\n const { model } = useDoc();\n return useDocumentLayout(model);\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatEditLayout\n * -----------------------------------------------------------------------------------------------*/\ntype LayoutData = FindContentTypeConfiguration.Response['data'];\n\n/**\n * @internal\n * @description takes the configuration data, the schema & the components used in the schema and formats the edit view\n * versions of the schema & components. This is then used to render the edit view of the content-type.\n */\nconst formatEditLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): EditLayout => {\n let currentPanelIndex = 0;\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const panelledEditAttributes = convertEditLayoutToFieldLayouts(\n data.contentType.layouts.edit,\n schema?.attributes,\n data.contentType.metadatas,\n { configurations: data.components, schemas: components },\n schemas\n ).reduce<Array<EditFieldLayout[][]>>((panels, row) => {\n if (row.some((field) => field.type === 'dynamiczone')) {\n panels.push([row]);\n currentPanelIndex += 2;\n } else {\n if (!panels[currentPanelIndex]) {\n panels.push([row]);\n } else {\n panels[currentPanelIndex].push(row);\n }\n }\n\n return panels;\n }, []);\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\n\n // Persisted configuration can reference component UIDs absent from `/init`.\n if (!componentSchema) {\n return acc;\n }\n\n acc[uid] = {\n layout: convertEditLayoutToFieldLayouts(\n configuration.layouts.edit,\n componentSchema.attributes,\n configuration.metadatas,\n { configurations: data.components, schemas: components }\n ),\n settings: {\n ...configuration.settings,\n icon: componentSchema.info.icon,\n displayName: componentSchema.info.displayName,\n },\n };\n return acc;\n },\n {}\n );\n\n const editMetadatas = Object.entries(data.contentType.metadatas).reduce<EditLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.edit,\n };\n },\n {}\n );\n\n return {\n layout: panelledEditAttributes,\n components: componentEditAttributes,\n metadatas: editMetadatas,\n settings: {\n ...data.contentType.settings,\n displayName: schema?.info?.displayName,\n },\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertEditLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the edit layout from either a content-type or a component\n * and formats it into a generic object that can be used to correctly render\n * the form fields.\n */\nconst convertEditLayoutToFieldLayouts = (\n rows: LayoutData['contentType']['layouts']['edit'],\n attributes: Schema['attributes'] = {},\n metadatas: Metadatas,\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return rows.map((row) =>\n row\n .map((field) => {\n const attribute = attributes[field.name];\n\n if (!attribute) {\n return null;\n }\n\n const fieldMetadata = metadatas[field.name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { edit: metadata } = fieldMetadata;\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n disabled: !metadata.editable,\n hint: metadata.description,\n label: metadata.label ?? '',\n name: field.name,\n // @ts-expect-error – mainField does exist on the metadata for a relation.\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n placeholder: metadata.placeholder ?? '',\n required: attribute.required ?? false,\n size: field.size,\n unique: 'unique' in attribute ? attribute.unique : false,\n visible: metadata.visible ?? true,\n type: attribute.type,\n };\n })\n .filter((field) => field !== null)\n ) as EditFieldLayout[][];\n};\n\n/* -------------------------------------------------------------------------------------------------\n * formatListLayout\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the complete configuration data, the schema & the components used in the schema and\n * formats a list view layout for the content-type. This is much simpler than the edit view layout as there\n * are less options to consider.\n */\nconst formatListLayout = (\n data: LayoutData,\n {\n schemas,\n schema,\n components,\n }: { schemas: Schema[]; schema?: Schema; components: ComponentsDictionary }\n): ListLayout => {\n const listMetadatas = Object.entries(data.contentType.metadatas).reduce<ListLayout['metadatas']>(\n (acc, [attribute, metadata]) => {\n return {\n ...acc,\n [attribute]: metadata.list,\n };\n },\n {}\n );\n /**\n * The fields arranged by the panels, new panels are made for dynamic zones only.\n */\n const listAttributes = convertListLayoutToFieldLayouts(\n data.contentType.layouts.list,\n schema?.attributes,\n listMetadatas,\n { configurations: data.components, schemas: components },\n schemas\n );\n\n return {\n layout: listAttributes,\n settings: { ...data.contentType.settings, displayName: schema?.info?.displayName },\n metadatas: listMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n ...data.contentType.options,\n },\n };\n};\n\n/* -------------------------------------------------------------------------------------------------\n * convertListLayoutToFieldLayouts\n * -----------------------------------------------------------------------------------------------*/\n\n/**\n * @internal\n * @description takes the columns from the list view configuration and formats them into a generic object\n * combinining metadata and attribute data.\n *\n * @note We do use this to reformat the list of strings when updating the displayed headers for the list view.\n */\nconst convertListLayoutToFieldLayouts = (\n columns: LayoutData['contentType']['layouts']['list'],\n attributes: Schema['attributes'] = {},\n metadatas: ListLayout['metadatas'],\n components?: {\n configurations: Record<string, ComponentConfiguration>;\n schemas: ComponentsDictionary;\n },\n schemas: Schema[] = []\n) => {\n return columns\n .map((name) => {\n const attribute = attributes[name];\n\n if (!attribute) {\n return null;\n }\n\n const metadata = metadatas[name];\n if (!metadata) {\n return null;\n }\n\n const settings: Partial<Settings> =\n attribute.type === 'component' && components\n ? (components.configurations[attribute.component]?.settings ?? {})\n : {};\n\n return {\n attribute,\n label: metadata.label ?? '',\n mainField: getMainField(attribute, metadata.mainField || settings.mainField, {\n schemas,\n components: components?.schemas ?? {},\n }),\n name: name,\n searchable: metadata.searchable ?? true,\n sortable: metadata.sortable ?? true,\n } satisfies ListFieldLayout;\n })\n .filter((field) => field !== null) as ListFieldLayout[];\n};\n\nexport {\n useDocLayout,\n useDocumentLayout,\n convertListLayoutToFieldLayouts,\n convertEditLayoutToFieldLayouts,\n DEFAULT_SETTINGS,\n};\nexport type { EditLayout, EditFieldLayout, ListLayout, ListFieldLayout, UseDocumentLayout };\n"],"names":["RESOLVED_LAYOUT_CACHE_LIMIT","resolvedLayoutCache","getCachedResolvedLayouts","components","data","model","schema","schemas","find","entry","value","setCachedResolvedLayouts","unshift","length","pop","DEFAULT_SETTINGS","bulkable","filterable","searchable","pagination","defaultSortBy","defaultSortOrder","mainField","pageSize","relationOpenMode","useDocumentLayout","useDocument","collectionType","skip","query","useQueryParams","runHookWaterfall","useStrapiApp","state","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","isLoading","isLoadingSchemas","useContentTypeSchema","currentData","isLoadingConfigs","error","useGetContentTypeConfigurationQuery","isConfigResolvedForModel","contentType","uid","stableLayoutsByModelRef","React","useRef","Map","useEffect","type","message","resolvedLayouts","useMemo","cachedLayouts","normalizedData","normalizeContentManagerLayout","edit","formatEditLayout","list","formatListLayout","listViewConversionContext","componentConfigurations","componentSchemas","contentTypeSchemas","layouts","current","set","stableLayouts","get","editLayout","layout","metadatas","options","settings","listLayout","HOOKS","MUTATE_EDIT_VIEW_LAYOUT","useDocLayout","useDoc","currentPanelIndex","panelledEditAttributes","convertEditLayoutToFieldLayouts","attributes","configurations","reduce","panels","row","some","field","push","componentEditAttributes","Object","entries","acc","configuration","componentSchema","icon","info","displayName","editMetadatas","attribute","metadata","pluginOptions","rows","map","name","fieldMetadata","component","disabled","editable","hint","description","label","getMainField","placeholder","required","size","unique","visible","filter","listMetadatas","listAttributes","convertListLayoutToFieldLayouts","columns","sortable"],"mappings":"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"}
@@ -46,7 +46,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
46
46
  const { toggleNotification } = strapiAdmin.useNotification();
47
47
  const { formatMessage } = reactIntl.useIntl();
48
48
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
49
- const { components: components$1, fieldSizes, schema, error: errorSchema, isLoading: isLoadingSchema, isFetching: isFetchingSchema } = init.useGetInitialDataQuery(undefined, {
49
+ const { components: components$1, fieldSizes, schema, schemas, error: errorSchema, isLoading: isLoadingSchema, isFetching: isFetchingSchema } = init.useGetInitialDataQuery(undefined, {
50
50
  selectFromResult: (res)=>{
51
51
  const schema = res.data?.components.find((ct)=>ct.uid === model);
52
52
  const componentsByKey = res.data?.components.reduce((acc, component)=>{
@@ -64,6 +64,7 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
64
64
  error: res.error,
65
65
  components,
66
66
  schema,
67
+ schemas: res.data?.contentTypes ?? [],
67
68
  fieldSizes
68
69
  };
69
70
  }
@@ -99,7 +100,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
99
100
  */ const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;
100
101
  const editLayout = React__namespace.useMemo(()=>data && !isLoading ? formatComponentConfigurationEditLayout.formatComponentConfigurationEditLayout(data, {
101
102
  schema,
102
- components: components$1
103
+ components: components$1,
104
+ schemas
103
105
  }) : {
104
106
  layout: [],
105
107
  components: {},
@@ -110,7 +112,8 @@ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
110
112
  data,
111
113
  isLoading,
112
114
  schema,
113
- components$1
115
+ components$1,
116
+ schemas
114
117
  ]);
115
118
  const [updateConfiguration] = components.useUpdateComponentConfigurationMutation();
116
119
  const handleSubmit = async (formData)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentConfigurationPage.js","sources":["../../../admin/src/pages/ComponentConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useAPIErrorHandler } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { TEMP_FIELD_NAME } from '../components/ConfigurationForm/Fields';\nimport { ConfigurationForm, ConfigurationFormProps } from '../components/ConfigurationForm/Form';\nimport { ComponentsDictionary, extractContentTypeComponents } from '../hooks/useContentTypeSchema';\nimport { DEFAULT_SETTINGS, EditLayout } from '../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../modules/hooks';\nimport {\n useGetComponentConfigurationQuery,\n useUpdateComponentConfigurationMutation,\n} from '../services/components';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { setIn } from '../utils/objects';\n\nimport { formatComponentConfigurationEditLayout } from './formatComponentConfigurationEditLayout';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type { Metadatas } from '../../../shared/contracts/content-types';\n\n/* -------------------------------------------------------------------------------------------------\n * ComponentConfigurationPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComponentConfigurationPage = () => {\n /**\n * useDocumentLayout only works for documents, not components,\n * it feels weird to make that hook work for both when this is SUCH\n * a unique use case and we only do it here, so in short, we essentially\n * just extracted the logic to make an edit view layout and reproduced it here.\n */\n const { slug: model } = useParams<{ slug: string }>();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const {\n components,\n fieldSizes,\n schema,\n error: errorSchema,\n isLoading: isLoadingSchema,\n isFetching: isFetchingSchema,\n } = useGetInitialDataQuery(undefined, {\n selectFromResult: (res) => {\n const schema = res.data?.components.find((ct) => ct.uid === model);\n\n const componentsByKey = res.data?.components.reduce<ComponentsDictionary>(\n (acc, component) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n const components = extractContentTypeComponents(schema?.attributes, componentsByKey);\n\n const fieldSizes = Object.entries(res.data?.fieldSizes ?? {}).reduce<\n ConfigurationFormProps['fieldSizes']\n >((acc, [attributeName, { default: size }]) => {\n acc[attributeName] = size;\n\n return acc;\n }, {});\n\n return {\n isFetching: res.isFetching,\n isLoading: res.isLoading,\n error: res.error,\n components,\n schema,\n fieldSizes,\n };\n },\n });\n\n React.useEffect(() => {\n if (errorSchema) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(errorSchema),\n });\n }\n }, [errorSchema, formatAPIError, toggleNotification]);\n\n const {\n data,\n isLoading: isLoadingConfig,\n isFetching: isFetchingConfig,\n error,\n } = useGetComponentConfigurationQuery(model ?? '');\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n /**\n * you **must** check if we're loading or fetching in case the component gets new props\n * but nothing was unmounted, it then becomes a fetch, not a load.\n */\n const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;\n\n const editLayout = React.useMemo(\n () =>\n data && !isLoading\n ? formatComponentConfigurationEditLayout(data, { schema, components })\n : ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [data, isLoading, schema, components]\n );\n\n const [updateConfiguration] = useUpdateComponentConfigurationMutation();\n const handleSubmit: ConfigurationFormProps['onSubmit'] = async (formData) => {\n try {\n /**\n * We reconstruct the metadatas object by taking the existing list metadatas\n * and re-merging that by attribute name with the current list metadatas, whilst overwriting\n * the data from the form we've built.\n */\n const meta = Object.entries(data?.component.metadatas ?? {}).reduce<Metadatas>(\n (acc, [name, { edit, list }]) => {\n const {\n __temp_key__,\n size: _size,\n name: _name,\n ...editedMetadata\n } = formData.layout.flatMap((row) => row.children).find((field) => field.name === name) ??\n {};\n\n acc[name] = {\n edit: {\n ...edit,\n ...editedMetadata,\n },\n list,\n };\n\n return acc;\n },\n {}\n );\n\n const res = await updateConfiguration({\n layouts: {\n edit: formData.layout.map((row) =>\n row.children.reduce<Array<{ name: string; size: number }>>((acc, { name, size }) => {\n if (name !== TEMP_FIELD_NAME) {\n return [...acc, { name, size }];\n }\n\n return acc;\n }, [])\n ),\n list: data?.component.layouts.list,\n },\n settings: setIn(formData.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || errorSchema || !schema) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>{`Configure ${editLayout.settings.displayName} Edit View`}</Page.Title>\n <ConfigurationForm\n onSubmit={handleSubmit}\n attributes={schema.attributes}\n fieldSizes={fieldSizes}\n layout={editLayout}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedComponentConfigurationPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.componentsConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ComponentConfigurationPage />\n </Page.Protect>\n );\n};\n\nexport { ComponentConfigurationPage, ProtectedComponentConfigurationPage };\n"],"names":["ComponentConfigurationPage","slug","model","useParams","toggleNotification","useNotification","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","components","fieldSizes","schema","error","errorSchema","isLoading","isLoadingSchema","isFetching","isFetchingSchema","useGetInitialDataQuery","undefined","selectFromResult","res","data","find","ct","uid","componentsByKey","reduce","acc","component","extractContentTypeComponents","attributes","Object","entries","attributeName","default","size","React","useEffect","type","message","isLoadingConfig","isFetchingConfig","useGetComponentConfigurationQuery","editLayout","useMemo","formatComponentConfigurationEditLayout","layout","metadatas","options","settings","DEFAULT_SETTINGS","updateConfiguration","useUpdateComponentConfigurationMutation","handleSubmit","formData","meta","name","edit","list","__temp_key__","_size","_name","editedMetadata","flatMap","row","children","field","layouts","map","TEMP_FIELD_NAME","setIn","id","defaultMessage","_jsx","Page","Loading","Error","_jsxs","_Fragment","Title","displayName","ConfigurationForm","onSubmit","ProtectedComponentConfigurationPage","permissions","useTypedSelector","state","admin_app","contentManager","componentsConfigurations","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"ComponentConfigurationPage.js","sources":["../../../admin/src/pages/ComponentConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useAPIErrorHandler } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { TEMP_FIELD_NAME } from '../components/ConfigurationForm/Fields';\nimport { ConfigurationForm, ConfigurationFormProps } from '../components/ConfigurationForm/Form';\nimport { ComponentsDictionary, extractContentTypeComponents } from '../hooks/useContentTypeSchema';\nimport { DEFAULT_SETTINGS, EditLayout } from '../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../modules/hooks';\nimport {\n useGetComponentConfigurationQuery,\n useUpdateComponentConfigurationMutation,\n} from '../services/components';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { setIn } from '../utils/objects';\n\nimport { formatComponentConfigurationEditLayout } from './formatComponentConfigurationEditLayout';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type { Metadatas } from '../../../shared/contracts/content-types';\n\n/* -------------------------------------------------------------------------------------------------\n * ComponentConfigurationPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComponentConfigurationPage = () => {\n /**\n * useDocumentLayout only works for documents, not components,\n * it feels weird to make that hook work for both when this is SUCH\n * a unique use case and we only do it here, so in short, we essentially\n * just extracted the logic to make an edit view layout and reproduced it here.\n */\n const { slug: model } = useParams<{ slug: string }>();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const {\n components,\n fieldSizes,\n schema,\n schemas,\n error: errorSchema,\n isLoading: isLoadingSchema,\n isFetching: isFetchingSchema,\n } = useGetInitialDataQuery(undefined, {\n selectFromResult: (res) => {\n const schema = res.data?.components.find((ct) => ct.uid === model);\n\n const componentsByKey = res.data?.components.reduce<ComponentsDictionary>(\n (acc, component) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n const components = extractContentTypeComponents(schema?.attributes, componentsByKey);\n\n const fieldSizes = Object.entries(res.data?.fieldSizes ?? {}).reduce<\n ConfigurationFormProps['fieldSizes']\n >((acc, [attributeName, { default: size }]) => {\n acc[attributeName] = size;\n\n return acc;\n }, {});\n\n return {\n isFetching: res.isFetching,\n isLoading: res.isLoading,\n error: res.error,\n components,\n schema,\n schemas: res.data?.contentTypes ?? [],\n fieldSizes,\n };\n },\n });\n\n React.useEffect(() => {\n if (errorSchema) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(errorSchema),\n });\n }\n }, [errorSchema, formatAPIError, toggleNotification]);\n\n const {\n data,\n isLoading: isLoadingConfig,\n isFetching: isFetchingConfig,\n error,\n } = useGetComponentConfigurationQuery(model ?? '');\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n /**\n * you **must** check if we're loading or fetching in case the component gets new props\n * but nothing was unmounted, it then becomes a fetch, not a load.\n */\n const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;\n\n const editLayout = React.useMemo(\n () =>\n data && !isLoading\n ? formatComponentConfigurationEditLayout(data, { schema, components, schemas })\n : ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [data, isLoading, schema, components, schemas]\n );\n\n const [updateConfiguration] = useUpdateComponentConfigurationMutation();\n const handleSubmit: ConfigurationFormProps['onSubmit'] = async (formData) => {\n try {\n /**\n * We reconstruct the metadatas object by taking the existing list metadatas\n * and re-merging that by attribute name with the current list metadatas, whilst overwriting\n * the data from the form we've built.\n */\n const meta = Object.entries(data?.component.metadatas ?? {}).reduce<Metadatas>(\n (acc, [name, { edit, list }]) => {\n const {\n __temp_key__,\n size: _size,\n name: _name,\n ...editedMetadata\n } = formData.layout.flatMap((row) => row.children).find((field) => field.name === name) ??\n {};\n\n acc[name] = {\n edit: {\n ...edit,\n ...editedMetadata,\n },\n list,\n };\n\n return acc;\n },\n {}\n );\n\n const res = await updateConfiguration({\n layouts: {\n edit: formData.layout.map((row) =>\n row.children.reduce<Array<{ name: string; size: number }>>((acc, { name, size }) => {\n if (name !== TEMP_FIELD_NAME) {\n return [...acc, { name, size }];\n }\n\n return acc;\n }, [])\n ),\n list: data?.component.layouts.list,\n },\n settings: setIn(formData.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || errorSchema || !schema) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>{`Configure ${editLayout.settings.displayName} Edit View`}</Page.Title>\n <ConfigurationForm\n onSubmit={handleSubmit}\n attributes={schema.attributes}\n fieldSizes={fieldSizes}\n layout={editLayout}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedComponentConfigurationPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.componentsConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ComponentConfigurationPage />\n </Page.Protect>\n );\n};\n\nexport { ComponentConfigurationPage, ProtectedComponentConfigurationPage };\n"],"names":["ComponentConfigurationPage","slug","model","useParams","toggleNotification","useNotification","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","components","fieldSizes","schema","schemas","error","errorSchema","isLoading","isLoadingSchema","isFetching","isFetchingSchema","useGetInitialDataQuery","undefined","selectFromResult","res","data","find","ct","uid","componentsByKey","reduce","acc","component","extractContentTypeComponents","attributes","Object","entries","attributeName","default","size","contentTypes","React","useEffect","type","message","isLoadingConfig","isFetchingConfig","useGetComponentConfigurationQuery","editLayout","useMemo","formatComponentConfigurationEditLayout","layout","metadatas","options","settings","DEFAULT_SETTINGS","updateConfiguration","useUpdateComponentConfigurationMutation","handleSubmit","formData","meta","name","edit","list","__temp_key__","_size","_name","editedMetadata","flatMap","row","children","field","layouts","map","TEMP_FIELD_NAME","setIn","id","defaultMessage","_jsx","Page","Loading","Error","_jsxs","_Fragment","Title","displayName","ConfigurationForm","onSubmit","ProtectedComponentConfigurationPage","permissions","useTypedSelector","state","admin_app","contentManager","componentsConfigurations","Protect"],"mappings":"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"}
@@ -25,7 +25,7 @@ import { formatComponentConfigurationEditLayout } from './formatComponentConfigu
25
25
  const { toggleNotification } = useNotification();
26
26
  const { formatMessage } = useIntl();
27
27
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
28
- const { components, fieldSizes, schema, error: errorSchema, isLoading: isLoadingSchema, isFetching: isFetchingSchema } = useGetInitialDataQuery(undefined, {
28
+ const { components, fieldSizes, schema, schemas, error: errorSchema, isLoading: isLoadingSchema, isFetching: isFetchingSchema } = useGetInitialDataQuery(undefined, {
29
29
  selectFromResult: (res)=>{
30
30
  const schema = res.data?.components.find((ct)=>ct.uid === model);
31
31
  const componentsByKey = res.data?.components.reduce((acc, component)=>{
@@ -43,6 +43,7 @@ import { formatComponentConfigurationEditLayout } from './formatComponentConfigu
43
43
  error: res.error,
44
44
  components,
45
45
  schema,
46
+ schemas: res.data?.contentTypes ?? [],
46
47
  fieldSizes
47
48
  };
48
49
  }
@@ -78,7 +79,8 @@ import { formatComponentConfigurationEditLayout } from './formatComponentConfigu
78
79
  */ const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;
79
80
  const editLayout = React.useMemo(()=>data && !isLoading ? formatComponentConfigurationEditLayout(data, {
80
81
  schema,
81
- components
82
+ components,
83
+ schemas
82
84
  }) : {
83
85
  layout: [],
84
86
  components: {},
@@ -89,7 +91,8 @@ import { formatComponentConfigurationEditLayout } from './formatComponentConfigu
89
91
  data,
90
92
  isLoading,
91
93
  schema,
92
- components
94
+ components,
95
+ schemas
93
96
  ]);
94
97
  const [updateConfiguration] = useUpdateComponentConfigurationMutation();
95
98
  const handleSubmit = async (formData)=>{
@@ -1 +1 @@
1
- {"version":3,"file":"ComponentConfigurationPage.mjs","sources":["../../../admin/src/pages/ComponentConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useAPIErrorHandler } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { TEMP_FIELD_NAME } from '../components/ConfigurationForm/Fields';\nimport { ConfigurationForm, ConfigurationFormProps } from '../components/ConfigurationForm/Form';\nimport { ComponentsDictionary, extractContentTypeComponents } from '../hooks/useContentTypeSchema';\nimport { DEFAULT_SETTINGS, EditLayout } from '../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../modules/hooks';\nimport {\n useGetComponentConfigurationQuery,\n useUpdateComponentConfigurationMutation,\n} from '../services/components';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { setIn } from '../utils/objects';\n\nimport { formatComponentConfigurationEditLayout } from './formatComponentConfigurationEditLayout';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type { Metadatas } from '../../../shared/contracts/content-types';\n\n/* -------------------------------------------------------------------------------------------------\n * ComponentConfigurationPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComponentConfigurationPage = () => {\n /**\n * useDocumentLayout only works for documents, not components,\n * it feels weird to make that hook work for both when this is SUCH\n * a unique use case and we only do it here, so in short, we essentially\n * just extracted the logic to make an edit view layout and reproduced it here.\n */\n const { slug: model } = useParams<{ slug: string }>();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const {\n components,\n fieldSizes,\n schema,\n error: errorSchema,\n isLoading: isLoadingSchema,\n isFetching: isFetchingSchema,\n } = useGetInitialDataQuery(undefined, {\n selectFromResult: (res) => {\n const schema = res.data?.components.find((ct) => ct.uid === model);\n\n const componentsByKey = res.data?.components.reduce<ComponentsDictionary>(\n (acc, component) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n const components = extractContentTypeComponents(schema?.attributes, componentsByKey);\n\n const fieldSizes = Object.entries(res.data?.fieldSizes ?? {}).reduce<\n ConfigurationFormProps['fieldSizes']\n >((acc, [attributeName, { default: size }]) => {\n acc[attributeName] = size;\n\n return acc;\n }, {});\n\n return {\n isFetching: res.isFetching,\n isLoading: res.isLoading,\n error: res.error,\n components,\n schema,\n fieldSizes,\n };\n },\n });\n\n React.useEffect(() => {\n if (errorSchema) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(errorSchema),\n });\n }\n }, [errorSchema, formatAPIError, toggleNotification]);\n\n const {\n data,\n isLoading: isLoadingConfig,\n isFetching: isFetchingConfig,\n error,\n } = useGetComponentConfigurationQuery(model ?? '');\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n /**\n * you **must** check if we're loading or fetching in case the component gets new props\n * but nothing was unmounted, it then becomes a fetch, not a load.\n */\n const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;\n\n const editLayout = React.useMemo(\n () =>\n data && !isLoading\n ? formatComponentConfigurationEditLayout(data, { schema, components })\n : ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [data, isLoading, schema, components]\n );\n\n const [updateConfiguration] = useUpdateComponentConfigurationMutation();\n const handleSubmit: ConfigurationFormProps['onSubmit'] = async (formData) => {\n try {\n /**\n * We reconstruct the metadatas object by taking the existing list metadatas\n * and re-merging that by attribute name with the current list metadatas, whilst overwriting\n * the data from the form we've built.\n */\n const meta = Object.entries(data?.component.metadatas ?? {}).reduce<Metadatas>(\n (acc, [name, { edit, list }]) => {\n const {\n __temp_key__,\n size: _size,\n name: _name,\n ...editedMetadata\n } = formData.layout.flatMap((row) => row.children).find((field) => field.name === name) ??\n {};\n\n acc[name] = {\n edit: {\n ...edit,\n ...editedMetadata,\n },\n list,\n };\n\n return acc;\n },\n {}\n );\n\n const res = await updateConfiguration({\n layouts: {\n edit: formData.layout.map((row) =>\n row.children.reduce<Array<{ name: string; size: number }>>((acc, { name, size }) => {\n if (name !== TEMP_FIELD_NAME) {\n return [...acc, { name, size }];\n }\n\n return acc;\n }, [])\n ),\n list: data?.component.layouts.list,\n },\n settings: setIn(formData.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || errorSchema || !schema) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>{`Configure ${editLayout.settings.displayName} Edit View`}</Page.Title>\n <ConfigurationForm\n onSubmit={handleSubmit}\n attributes={schema.attributes}\n fieldSizes={fieldSizes}\n layout={editLayout}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedComponentConfigurationPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.componentsConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ComponentConfigurationPage />\n </Page.Protect>\n );\n};\n\nexport { ComponentConfigurationPage, ProtectedComponentConfigurationPage };\n"],"names":["ComponentConfigurationPage","slug","model","useParams","toggleNotification","useNotification","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","components","fieldSizes","schema","error","errorSchema","isLoading","isLoadingSchema","isFetching","isFetchingSchema","useGetInitialDataQuery","undefined","selectFromResult","res","data","find","ct","uid","componentsByKey","reduce","acc","component","extractContentTypeComponents","attributes","Object","entries","attributeName","default","size","React","useEffect","type","message","isLoadingConfig","isFetchingConfig","useGetComponentConfigurationQuery","editLayout","useMemo","formatComponentConfigurationEditLayout","layout","metadatas","options","settings","DEFAULT_SETTINGS","updateConfiguration","useUpdateComponentConfigurationMutation","handleSubmit","formData","meta","name","edit","list","__temp_key__","_size","_name","editedMetadata","flatMap","row","children","field","layouts","map","TEMP_FIELD_NAME","setIn","id","defaultMessage","_jsx","Page","Loading","Error","_jsxs","_Fragment","Title","displayName","ConfigurationForm","onSubmit","ProtectedComponentConfigurationPage","permissions","useTypedSelector","state","admin_app","contentManager","componentsConfigurations","Protect"],"mappings":"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"}
1
+ {"version":3,"file":"ComponentConfigurationPage.mjs","sources":["../../../admin/src/pages/ComponentConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page, useNotification, useAPIErrorHandler } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useParams } from 'react-router-dom';\n\nimport { TEMP_FIELD_NAME } from '../components/ConfigurationForm/Fields';\nimport { ConfigurationForm, ConfigurationFormProps } from '../components/ConfigurationForm/Form';\nimport { ComponentsDictionary, extractContentTypeComponents } from '../hooks/useContentTypeSchema';\nimport { DEFAULT_SETTINGS, EditLayout } from '../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../modules/hooks';\nimport {\n useGetComponentConfigurationQuery,\n useUpdateComponentConfigurationMutation,\n} from '../services/components';\nimport { useGetInitialDataQuery } from '../services/init';\nimport { setIn } from '../utils/objects';\n\nimport { formatComponentConfigurationEditLayout } from './formatComponentConfigurationEditLayout';\n\nimport type { Component } from '../../../shared/contracts/components';\nimport type { Metadatas } from '../../../shared/contracts/content-types';\n\n/* -------------------------------------------------------------------------------------------------\n * ComponentConfigurationPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ComponentConfigurationPage = () => {\n /**\n * useDocumentLayout only works for documents, not components,\n * it feels weird to make that hook work for both when this is SUCH\n * a unique use case and we only do it here, so in short, we essentially\n * just extracted the logic to make an edit view layout and reproduced it here.\n */\n const { slug: model } = useParams<{ slug: string }>();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const {\n components,\n fieldSizes,\n schema,\n schemas,\n error: errorSchema,\n isLoading: isLoadingSchema,\n isFetching: isFetchingSchema,\n } = useGetInitialDataQuery(undefined, {\n selectFromResult: (res) => {\n const schema = res.data?.components.find((ct) => ct.uid === model);\n\n const componentsByKey = res.data?.components.reduce<ComponentsDictionary>(\n (acc, component) => {\n acc[component.uid] = component;\n\n return acc;\n },\n {}\n );\n\n const components = extractContentTypeComponents(schema?.attributes, componentsByKey);\n\n const fieldSizes = Object.entries(res.data?.fieldSizes ?? {}).reduce<\n ConfigurationFormProps['fieldSizes']\n >((acc, [attributeName, { default: size }]) => {\n acc[attributeName] = size;\n\n return acc;\n }, {});\n\n return {\n isFetching: res.isFetching,\n isLoading: res.isLoading,\n error: res.error,\n components,\n schema,\n schemas: res.data?.contentTypes ?? [],\n fieldSizes,\n };\n },\n });\n\n React.useEffect(() => {\n if (errorSchema) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(errorSchema),\n });\n }\n }, [errorSchema, formatAPIError, toggleNotification]);\n\n const {\n data,\n isLoading: isLoadingConfig,\n isFetching: isFetchingConfig,\n error,\n } = useGetComponentConfigurationQuery(model ?? '');\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n /**\n * you **must** check if we're loading or fetching in case the component gets new props\n * but nothing was unmounted, it then becomes a fetch, not a load.\n */\n const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;\n\n const editLayout = React.useMemo(\n () =>\n data && !isLoading\n ? formatComponentConfigurationEditLayout(data, { schema, components, schemas })\n : ({\n layout: [],\n components: {},\n metadatas: {},\n options: {},\n settings: DEFAULT_SETTINGS,\n } as EditLayout),\n [data, isLoading, schema, components, schemas]\n );\n\n const [updateConfiguration] = useUpdateComponentConfigurationMutation();\n const handleSubmit: ConfigurationFormProps['onSubmit'] = async (formData) => {\n try {\n /**\n * We reconstruct the metadatas object by taking the existing list metadatas\n * and re-merging that by attribute name with the current list metadatas, whilst overwriting\n * the data from the form we've built.\n */\n const meta = Object.entries(data?.component.metadatas ?? {}).reduce<Metadatas>(\n (acc, [name, { edit, list }]) => {\n const {\n __temp_key__,\n size: _size,\n name: _name,\n ...editedMetadata\n } = formData.layout.flatMap((row) => row.children).find((field) => field.name === name) ??\n {};\n\n acc[name] = {\n edit: {\n ...edit,\n ...editedMetadata,\n },\n list,\n };\n\n return acc;\n },\n {}\n );\n\n const res = await updateConfiguration({\n layouts: {\n edit: formData.layout.map((row) =>\n row.children.reduce<Array<{ name: string; size: number }>>((acc, { name, size }) => {\n if (name !== TEMP_FIELD_NAME) {\n return [...acc, { name, size }];\n }\n\n return acc;\n }, [])\n ),\n list: data?.component.layouts.list,\n },\n settings: setIn(formData.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.success.saved', defaultMessage: 'Saved' }),\n });\n } else {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n }\n } catch {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || errorSchema || !schema) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Page.Title>{`Configure ${editLayout.settings.displayName} Edit View`}</Page.Title>\n <ConfigurationForm\n onSubmit={handleSubmit}\n attributes={schema.attributes}\n fieldSizes={fieldSizes}\n layout={editLayout}\n />\n </>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Header\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedComponentConfigurationPage = () => {\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.componentsConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ComponentConfigurationPage />\n </Page.Protect>\n );\n};\n\nexport { ComponentConfigurationPage, ProtectedComponentConfigurationPage };\n"],"names":["ComponentConfigurationPage","slug","model","useParams","toggleNotification","useNotification","formatMessage","useIntl","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","components","fieldSizes","schema","schemas","error","errorSchema","isLoading","isLoadingSchema","isFetching","isFetchingSchema","useGetInitialDataQuery","undefined","selectFromResult","res","data","find","ct","uid","componentsByKey","reduce","acc","component","extractContentTypeComponents","attributes","Object","entries","attributeName","default","size","contentTypes","React","useEffect","type","message","isLoadingConfig","isFetchingConfig","useGetComponentConfigurationQuery","editLayout","useMemo","formatComponentConfigurationEditLayout","layout","metadatas","options","settings","DEFAULT_SETTINGS","updateConfiguration","useUpdateComponentConfigurationMutation","handleSubmit","formData","meta","name","edit","list","__temp_key__","_size","_name","editedMetadata","flatMap","row","children","field","layouts","map","TEMP_FIELD_NAME","setIn","id","defaultMessage","_jsx","Page","Loading","Error","_jsxs","_Fragment","Title","displayName","ConfigurationForm","onSubmit","ProtectedComponentConfigurationPage","permissions","useTypedSelector","state","admin_app","contentManager","componentsConfigurations","Protect"],"mappings":"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"}