@strapi/content-manager 5.46.0 → 5.46.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.
- package/dist/admin/constants/hooks.js +5 -0
- package/dist/admin/constants/hooks.js.map +1 -1
- package/dist/admin/constants/hooks.mjs +5 -0
- package/dist/admin/constants/hooks.mjs.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js +1 -1
- package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs +1 -1
- package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +2 -45
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.mjs +3 -46
- package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +11 -3
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +1 -0
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +1 -0
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +38 -4
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +39 -5
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js +58 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +56 -0
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -0
- package/dist/admin/src/constants/hooks.d.ts +23 -0
- package/dist/admin/src/exports.d.ts +1 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/Relations/Relations.d.ts +9 -5
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/EditorLayout.d.ts +4 -2
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/WysiwygStyles.d.ts +38 -6
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +27 -5
- package/dist/admin/src/pages/ListView/components/Filters.d.ts +3 -4
- package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +15 -0
- package/dist/admin/translations/cs.json.js +0 -1
- package/dist/admin/translations/cs.json.js.map +1 -1
- package/dist/admin/translations/cs.json.mjs +0 -1
- package/dist/admin/translations/cs.json.mjs.map +1 -1
- package/dist/admin/translations/de.json.js +0 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +0 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +0 -1
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +0 -1
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/translations/es.json.js +0 -1
- package/dist/admin/translations/es.json.js.map +1 -1
- package/dist/admin/translations/es.json.mjs +0 -1
- package/dist/admin/translations/es.json.mjs.map +1 -1
- package/dist/admin/translations/fr.json.js +0 -1
- package/dist/admin/translations/fr.json.js.map +1 -1
- package/dist/admin/translations/fr.json.mjs +0 -1
- package/dist/admin/translations/fr.json.mjs.map +1 -1
- package/dist/admin/translations/nl.json.js +0 -1
- package/dist/admin/translations/nl.json.js.map +1 -1
- package/dist/admin/translations/nl.json.mjs +0 -1
- package/dist/admin/translations/nl.json.mjs.map +1 -1
- package/dist/admin/translations/pl.json.js +0 -1
- package/dist/admin/translations/pl.json.js.map +1 -1
- package/dist/admin/translations/pl.json.mjs +0 -1
- package/dist/admin/translations/pl.json.mjs.map +1 -1
- package/dist/admin/translations/ru.json.js +0 -1
- package/dist/admin/translations/ru.json.js.map +1 -1
- package/dist/admin/translations/ru.json.mjs +0 -1
- package/dist/admin/translations/ru.json.mjs.map +1 -1
- package/dist/admin/translations/uk.json.js +0 -1
- package/dist/admin/translations/uk.json.js.map +1 -1
- package/dist/admin/translations/uk.json.mjs +0 -1
- package/dist/admin/translations/uk.json.mjs.map +1 -1
- package/dist/admin/translations/zh-Hans.json.js +0 -1
- package/dist/admin/translations/zh-Hans.json.js.map +1 -1
- package/dist/admin/translations/zh-Hans.json.mjs +0 -1
- package/dist/admin/translations/zh-Hans.json.mjs.map +1 -1
- package/package.json +6 -6
|
@@ -6,11 +6,12 @@ import { useParams } from 'react-router-dom';
|
|
|
6
6
|
import { TEMP_FIELD_NAME } from '../components/ConfigurationForm/Fields.mjs';
|
|
7
7
|
import { ConfigurationForm } from '../components/ConfigurationForm/Form.mjs';
|
|
8
8
|
import { extractContentTypeComponents } from '../hooks/useContentTypeSchema.mjs';
|
|
9
|
-
import { DEFAULT_SETTINGS
|
|
9
|
+
import { DEFAULT_SETTINGS } from '../hooks/useDocumentLayout.mjs';
|
|
10
10
|
import { useTypedSelector } from '../modules/hooks.mjs';
|
|
11
11
|
import { useGetComponentConfigurationQuery, useUpdateComponentConfigurationMutation } from '../services/components.mjs';
|
|
12
12
|
import { useGetInitialDataQuery } from '../services/init.mjs';
|
|
13
13
|
import { setIn } from '../utils/objects.mjs';
|
|
14
|
+
import { formatComponentConfigurationEditLayout } from './formatComponentConfigurationEditLayout.mjs';
|
|
14
15
|
|
|
15
16
|
/* -------------------------------------------------------------------------------------------------
|
|
16
17
|
* ComponentConfigurationPage
|
|
@@ -75,7 +76,7 @@ import { setIn } from '../utils/objects.mjs';
|
|
|
75
76
|
* you **must** check if we're loading or fetching in case the component gets new props
|
|
76
77
|
* but nothing was unmounted, it then becomes a fetch, not a load.
|
|
77
78
|
*/ const isLoading = isLoadingConfig || isLoadingSchema || isFetchingConfig || isFetchingSchema;
|
|
78
|
-
const editLayout = React.useMemo(()=>data && !isLoading ?
|
|
79
|
+
const editLayout = React.useMemo(()=>data && !isLoading ? formatComponentConfigurationEditLayout(data, {
|
|
79
80
|
schema,
|
|
80
81
|
components
|
|
81
82
|
}) : {
|
|
@@ -172,50 +173,6 @@ import { setIn } from '../utils/objects.mjs';
|
|
|
172
173
|
]
|
|
173
174
|
});
|
|
174
175
|
};
|
|
175
|
-
/* -------------------------------------------------------------------------------------------------
|
|
176
|
-
* Header
|
|
177
|
-
* -----------------------------------------------------------------------------------------------*/ const formatEditLayout = (data, { schema, components })=>{
|
|
178
|
-
const editAttributes = convertEditLayoutToFieldLayouts(data.component.layouts.edit, schema?.attributes, data.component.metadatas, {
|
|
179
|
-
configurations: data.components,
|
|
180
|
-
schemas: components
|
|
181
|
-
});
|
|
182
|
-
const componentEditAttributes = Object.entries(data.components).reduce((acc, [uid, configuration])=>{
|
|
183
|
-
const componentSchema = components[uid];
|
|
184
|
-
if (!componentSchema) {
|
|
185
|
-
return acc;
|
|
186
|
-
}
|
|
187
|
-
acc[uid] = {
|
|
188
|
-
layout: convertEditLayoutToFieldLayouts(configuration.layouts.edit, componentSchema.attributes, configuration.metadatas),
|
|
189
|
-
settings: {
|
|
190
|
-
...configuration.settings,
|
|
191
|
-
icon: componentSchema.info.icon,
|
|
192
|
-
displayName: componentSchema.info.displayName
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
return acc;
|
|
196
|
-
}, {});
|
|
197
|
-
const editMetadatas = Object.entries(data.component.metadatas).reduce((acc, [attribute, metadata])=>{
|
|
198
|
-
return {
|
|
199
|
-
...acc,
|
|
200
|
-
[attribute]: metadata.edit
|
|
201
|
-
};
|
|
202
|
-
}, {});
|
|
203
|
-
return {
|
|
204
|
-
layout: [
|
|
205
|
-
editAttributes
|
|
206
|
-
],
|
|
207
|
-
components: componentEditAttributes,
|
|
208
|
-
metadatas: editMetadatas,
|
|
209
|
-
options: {
|
|
210
|
-
...schema?.options,
|
|
211
|
-
...schema?.pluginOptions
|
|
212
|
-
},
|
|
213
|
-
settings: {
|
|
214
|
-
...data.component.settings,
|
|
215
|
-
displayName: schema?.info.displayName
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
};
|
|
219
176
|
/* -------------------------------------------------------------------------------------------------
|
|
220
177
|
* Header
|
|
221
178
|
* -----------------------------------------------------------------------------------------------*/ const ProtectedComponentConfigurationPage = ()=>{
|
|
@@ -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 {\n DEFAULT_SETTINGS,\n EditLayout,\n convertEditLayoutToFieldLayouts,\n} 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 type { Component, FindComponentConfiguration } 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 ? formatEditLayout(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 formatEditLayout = (\n data: FindComponentConfiguration.Response['data'],\n { schema, components }: { schema?: Component; components: ComponentsDictionary }\n) => {\n const editAttributes = convertEditLayoutToFieldLayouts(\n data.component.layouts.edit,\n schema?.attributes,\n data.component.metadatas,\n { configurations: data.components, schemas: components }\n );\n\n const componentEditAttributes = Object.entries(data.components).reduce<EditLayout['components']>(\n (acc, [uid, configuration]) => {\n const componentSchema = components[uid];\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 ),\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.component.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: [editAttributes],\n components: componentEditAttributes,\n metadatas: editMetadatas,\n options: {\n ...schema?.options,\n ...schema?.pluginOptions,\n },\n settings: {\n ...data.component.settings,\n displayName: schema?.info.displayName,\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","formatEditLayout","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","editAttributes","convertEditLayoutToFieldLayouts","configurations","schemas","componentEditAttributes","configuration","componentSchema","icon","info","editMetadatas","attribute","metadata","pluginOptions","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 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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"}
|
|
@@ -41,7 +41,7 @@ const ListConfiguration = ()=>{
|
|
|
41
41
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
42
42
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
|
43
43
|
const { model, collectionType, schema } = useDocument.useDoc();
|
|
44
|
-
const { isLoading: isLoadingLayout, list, edit } = useDocumentLayout.useDocLayout();
|
|
44
|
+
const { isLoading: isLoadingLayout, list, edit, listViewConversionContext } = useDocumentLayout.useDocLayout();
|
|
45
45
|
const [displayedHeaderNames, setDisplayedHeaderNames] = strapiAdmin.useScopedPersistentState(`STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`, null);
|
|
46
46
|
const { metadata } = contentTypes.useGetContentTypeConfigurationQuery(model, {
|
|
47
47
|
selectFromResult: ({ data })=>({
|
|
@@ -117,8 +117,15 @@ const ListConfiguration = ()=>{
|
|
|
117
117
|
};
|
|
118
118
|
return acc;
|
|
119
119
|
}, {});
|
|
120
|
+
/**
|
|
121
|
+
* Same context as `formatListLayout` / `ListViewPage#displayedHeaders` so `getMainField`
|
|
122
|
+
* can resolve component and relation list columns (see #25509, #25872).
|
|
123
|
+
*/ const listFieldLayouts = listViewConversionContext ? useDocumentLayout.convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas, {
|
|
124
|
+
configurations: listViewConversionContext.componentConfigurations,
|
|
125
|
+
schemas: listViewConversionContext.componentSchemas
|
|
126
|
+
}, listViewConversionContext.contentTypeSchemas) : useDocumentLayout.convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas);
|
|
120
127
|
return {
|
|
121
|
-
layout:
|
|
128
|
+
layout: listFieldLayouts.map(({ label, sortable, name })=>({
|
|
122
129
|
label: typeof label === 'string' ? label : formatMessage(label),
|
|
123
130
|
sortable,
|
|
124
131
|
name
|
|
@@ -130,7 +137,8 @@ const ListConfiguration = ()=>{
|
|
|
130
137
|
list,
|
|
131
138
|
displayedHeaderNames,
|
|
132
139
|
schema,
|
|
133
|
-
metadata
|
|
140
|
+
metadata,
|
|
141
|
+
listViewConversionContext
|
|
134
142
|
]);
|
|
135
143
|
if (collectionType === collections.SINGLE_TYPES) {
|
|
136
144
|
return /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Navigate, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListConfigurationPage.js","sources":["../../../../admin/src/pages/ListConfiguration/ListConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n type FormProps,\n useNotification,\n useScopedPersistentState,\n useTracking,\n useAPIErrorHandler,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Divider, Flex, Main } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\n\nimport { SINGLE_TYPES } from '../../constants/collections';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n convertListLayoutToFieldLayouts,\n type ListFieldLayout,\n type ListLayout,\n useDocLayout,\n} from '../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n useGetContentTypeConfigurationQuery,\n useUpdateContentTypeConfigurationMutation,\n} from '../../services/contentTypes';\nimport { setIn } from '../../utils/objects';\n\nimport { Header } from './components/Header';\nimport { Settings } from './components/Settings';\nimport { SortDisplayedFields } from './components/SortDisplayedFields';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\n\ninterface FormData extends Pick<ListLayout, 'settings'> {\n layout: Array<Pick<ListFieldLayout, 'sortable' | 'name'> & { label: string }>;\n}\n\nconst ListConfiguration = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { model, collectionType, schema } = useDoc();\n\n const { isLoading: isLoadingLayout, list, edit } = useDocLayout();\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({\n metadata: data?.contentType.metadatas ?? {},\n }),\n });\n\n const [updateContentTypeConfiguration] = useUpdateContentTypeConfigurationMutation();\n const handleSubmit: FormProps<FormData>['onSubmit'] = async (data) => {\n try {\n trackUsage('willSaveContentTypeLayout');\n const layoutData = data.layout ?? [];\n /**\n * We reconstruct the metadatas object by taking the existing edit 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(edit.metadatas).reduce<Metadatas>((acc, [name, editMeta]) => {\n const { mainField: _mainField, ...listMeta } = list.metadatas[name];\n\n const { label, sortable } = layoutData.find((field) => field.name === name) ?? {};\n\n acc[name] = {\n edit: editMeta,\n list: {\n ...listMeta,\n label: label || listMeta.label,\n sortable: sortable || listMeta.sortable,\n },\n };\n\n return acc;\n }, {});\n\n const res = await updateContentTypeConfiguration({\n layouts: {\n edit: edit.layout.flatMap((panel) =>\n panel.map((row) => row.map(({ name, size }) => ({ name, size })))\n ),\n list: layoutData.map((field) => field.name),\n },\n settings: setIn(data.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n setDisplayedHeaderNames(layoutData.map((field) => field.name));\n trackUsage('didEditListSettings');\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 (err) {\n console.error(err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const initialValues = React.useMemo(() => {\n const headerNames =\n displayedHeaderNames && displayedHeaderNames.length > 0\n ? displayedHeaderNames\n : list.layout.map((field) => field.name);\n\n const headerMetadatas = headerNames.reduce<ListLayout['metadatas']>((acc, name) => {\n acc[name] = metadata[name]?.list ?? list.metadatas[name] ?? { label: name };\n return acc;\n }, {});\n\n return {\n layout: convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas).map(\n ({ label, sortable, name }) => ({\n label: typeof label === 'string' ? label : formatMessage(label),\n sortable,\n name,\n })\n ),\n settings: list.settings,\n } satisfies FormData;\n }, [formatMessage, list, displayedHeaderNames, schema, metadata]);\n\n if (collectionType === SINGLE_TYPES) {\n return <Navigate to={`/single-types/${model}`} />;\n }\n\n if (isLoadingLayout) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{`Configure ${list.settings.displayName} List View`}</Page.Title>\n <Main>\n <Form initialValues={initialValues} onSubmit={handleSubmit} method=\"PUT\">\n <Header\n collectionType={collectionType}\n model={model}\n name={list.settings.displayName ?? ''}\n />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n position=\"relative\"\n >\n <Settings />\n <Divider />\n <SortDisplayedFields />\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </Layouts.Root>\n );\n};\n\nconst ProtectedListConfiguration = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListConfiguration key={slug} />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListConfiguration, ListConfiguration };\nexport type { FormData };\n"],"names":["ListConfiguration","formatMessage","useIntl","trackUsage","useTracking","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","model","collectionType","schema","useDoc","isLoading","isLoadingLayout","list","edit","useDocLayout","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","metadata","useGetContentTypeConfigurationQuery","selectFromResult","data","contentType","metadatas","updateContentTypeConfiguration","useUpdateContentTypeConfigurationMutation","handleSubmit","layoutData","layout","meta","Object","entries","reduce","acc","name","editMeta","mainField","_mainField","listMeta","label","sortable","find","field","res","layouts","flatMap","panel","map","row","size","settings","setIn","undefined","uid","type","message","id","defaultMessage","error","err","console","initialValues","React","useMemo","headerNames","length","headerMetadatas","convertListLayoutToFieldLayouts","attributes","SINGLE_TYPES","_jsx","Navigate","to","Page","Loading","_jsxs","Layouts","Root","Title","displayName","Main","Form","onSubmit","method","Header","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","position","Settings","Divider","SortDisplayedFields","ProtectedListConfiguration","slug","useParams","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListConfigurationPage.js","sources":["../../../../admin/src/pages/ListConfiguration/ListConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n type FormProps,\n useNotification,\n useScopedPersistentState,\n useTracking,\n useAPIErrorHandler,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Divider, Flex, Main } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\n\nimport { SINGLE_TYPES } from '../../constants/collections';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n convertListLayoutToFieldLayouts,\n type ListFieldLayout,\n type ListLayout,\n useDocLayout,\n} from '../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n useGetContentTypeConfigurationQuery,\n useUpdateContentTypeConfigurationMutation,\n} from '../../services/contentTypes';\nimport { setIn } from '../../utils/objects';\n\nimport { Header } from './components/Header';\nimport { Settings } from './components/Settings';\nimport { SortDisplayedFields } from './components/SortDisplayedFields';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\n\ninterface FormData extends Pick<ListLayout, 'settings'> {\n layout: Array<Pick<ListFieldLayout, 'sortable' | 'name'> & { label: string }>;\n}\n\nconst ListConfiguration = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { model, collectionType, schema } = useDoc();\n\n const { isLoading: isLoadingLayout, list, edit, listViewConversionContext } = useDocLayout();\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({\n metadata: data?.contentType.metadatas ?? {},\n }),\n });\n\n const [updateContentTypeConfiguration] = useUpdateContentTypeConfigurationMutation();\n const handleSubmit: FormProps<FormData>['onSubmit'] = async (data) => {\n try {\n trackUsage('willSaveContentTypeLayout');\n const layoutData = data.layout ?? [];\n /**\n * We reconstruct the metadatas object by taking the existing edit 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(edit.metadatas).reduce<Metadatas>((acc, [name, editMeta]) => {\n const { mainField: _mainField, ...listMeta } = list.metadatas[name];\n\n const { label, sortable } = layoutData.find((field) => field.name === name) ?? {};\n\n acc[name] = {\n edit: editMeta,\n list: {\n ...listMeta,\n label: label || listMeta.label,\n sortable: sortable || listMeta.sortable,\n },\n };\n\n return acc;\n }, {});\n\n const res = await updateContentTypeConfiguration({\n layouts: {\n edit: edit.layout.flatMap((panel) =>\n panel.map((row) => row.map(({ name, size }) => ({ name, size })))\n ),\n list: layoutData.map((field) => field.name),\n },\n settings: setIn(data.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n setDisplayedHeaderNames(layoutData.map((field) => field.name));\n trackUsage('didEditListSettings');\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 (err) {\n console.error(err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const initialValues = React.useMemo(() => {\n const headerNames =\n displayedHeaderNames && displayedHeaderNames.length > 0\n ? displayedHeaderNames\n : list.layout.map((field) => field.name);\n\n const headerMetadatas = headerNames.reduce<ListLayout['metadatas']>((acc, name) => {\n acc[name] = metadata[name]?.list ?? list.metadatas[name] ?? { label: name };\n return acc;\n }, {});\n\n /**\n * Same context as `formatListLayout` / `ListViewPage#displayedHeaders` so `getMainField`\n * can resolve component and relation list columns (see #25509, #25872).\n */\n const listFieldLayouts = listViewConversionContext\n ? convertListLayoutToFieldLayouts(\n headerNames,\n schema?.attributes,\n headerMetadatas,\n {\n configurations: listViewConversionContext.componentConfigurations,\n schemas: listViewConversionContext.componentSchemas,\n },\n listViewConversionContext.contentTypeSchemas\n )\n : convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas);\n\n return {\n layout: listFieldLayouts.map(({ label, sortable, name }) => ({\n label: typeof label === 'string' ? label : formatMessage(label),\n sortable,\n name,\n })),\n settings: list.settings,\n } satisfies FormData;\n }, [formatMessage, list, displayedHeaderNames, schema, metadata, listViewConversionContext]);\n\n if (collectionType === SINGLE_TYPES) {\n return <Navigate to={`/single-types/${model}`} />;\n }\n\n if (isLoadingLayout) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{`Configure ${list.settings.displayName} List View`}</Page.Title>\n <Main>\n <Form initialValues={initialValues} onSubmit={handleSubmit} method=\"PUT\">\n <Header\n collectionType={collectionType}\n model={model}\n name={list.settings.displayName ?? ''}\n />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n position=\"relative\"\n >\n <Settings />\n <Divider />\n <SortDisplayedFields />\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </Layouts.Root>\n );\n};\n\nconst ProtectedListConfiguration = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListConfiguration key={slug} />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListConfiguration, ListConfiguration };\nexport type { FormData };\n"],"names":["ListConfiguration","formatMessage","useIntl","trackUsage","useTracking","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","model","collectionType","schema","useDoc","isLoading","isLoadingLayout","list","edit","listViewConversionContext","useDocLayout","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","metadata","useGetContentTypeConfigurationQuery","selectFromResult","data","contentType","metadatas","updateContentTypeConfiguration","useUpdateContentTypeConfigurationMutation","handleSubmit","layoutData","layout","meta","Object","entries","reduce","acc","name","editMeta","mainField","_mainField","listMeta","label","sortable","find","field","res","layouts","flatMap","panel","map","row","size","settings","setIn","undefined","uid","type","message","id","defaultMessage","error","err","console","initialValues","React","useMemo","headerNames","length","headerMetadatas","listFieldLayouts","convertListLayoutToFieldLayouts","attributes","configurations","componentConfigurations","schemas","componentSchemas","contentTypeSchemas","SINGLE_TYPES","_jsx","Navigate","to","Page","Loading","_jsxs","Layouts","Root","Title","displayName","Main","Form","onSubmit","method","Header","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","position","Settings","Divider","SortDisplayedFields","ProtectedListConfiguration","slug","useParams","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","Protect"],"mappings":"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"}
|
|
@@ -20,7 +20,7 @@ const ListConfiguration = ()=>{
|
|
|
20
20
|
const { toggleNotification } = useNotification();
|
|
21
21
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
|
22
22
|
const { model, collectionType, schema } = useDoc();
|
|
23
|
-
const { isLoading: isLoadingLayout, list, edit } = useDocLayout();
|
|
23
|
+
const { isLoading: isLoadingLayout, list, edit, listViewConversionContext } = useDocLayout();
|
|
24
24
|
const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState(`STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`, null);
|
|
25
25
|
const { metadata } = useGetContentTypeConfigurationQuery(model, {
|
|
26
26
|
selectFromResult: ({ data })=>({
|
|
@@ -96,8 +96,15 @@ const ListConfiguration = ()=>{
|
|
|
96
96
|
};
|
|
97
97
|
return acc;
|
|
98
98
|
}, {});
|
|
99
|
+
/**
|
|
100
|
+
* Same context as `formatListLayout` / `ListViewPage#displayedHeaders` so `getMainField`
|
|
101
|
+
* can resolve component and relation list columns (see #25509, #25872).
|
|
102
|
+
*/ const listFieldLayouts = listViewConversionContext ? convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas, {
|
|
103
|
+
configurations: listViewConversionContext.componentConfigurations,
|
|
104
|
+
schemas: listViewConversionContext.componentSchemas
|
|
105
|
+
}, listViewConversionContext.contentTypeSchemas) : convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas);
|
|
99
106
|
return {
|
|
100
|
-
layout:
|
|
107
|
+
layout: listFieldLayouts.map(({ label, sortable, name })=>({
|
|
101
108
|
label: typeof label === 'string' ? label : formatMessage(label),
|
|
102
109
|
sortable,
|
|
103
110
|
name
|
|
@@ -109,7 +116,8 @@ const ListConfiguration = ()=>{
|
|
|
109
116
|
list,
|
|
110
117
|
displayedHeaderNames,
|
|
111
118
|
schema,
|
|
112
|
-
metadata
|
|
119
|
+
metadata,
|
|
120
|
+
listViewConversionContext
|
|
113
121
|
]);
|
|
114
122
|
if (collectionType === SINGLE_TYPES) {
|
|
115
123
|
return /*#__PURE__*/ jsx(Navigate, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListConfigurationPage.mjs","sources":["../../../../admin/src/pages/ListConfiguration/ListConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n type FormProps,\n useNotification,\n useScopedPersistentState,\n useTracking,\n useAPIErrorHandler,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Divider, Flex, Main } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\n\nimport { SINGLE_TYPES } from '../../constants/collections';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n convertListLayoutToFieldLayouts,\n type ListFieldLayout,\n type ListLayout,\n useDocLayout,\n} from '../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n useGetContentTypeConfigurationQuery,\n useUpdateContentTypeConfigurationMutation,\n} from '../../services/contentTypes';\nimport { setIn } from '../../utils/objects';\n\nimport { Header } from './components/Header';\nimport { Settings } from './components/Settings';\nimport { SortDisplayedFields } from './components/SortDisplayedFields';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\n\ninterface FormData extends Pick<ListLayout, 'settings'> {\n layout: Array<Pick<ListFieldLayout, 'sortable' | 'name'> & { label: string }>;\n}\n\nconst ListConfiguration = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { model, collectionType, schema } = useDoc();\n\n const { isLoading: isLoadingLayout, list, edit } = useDocLayout();\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({\n metadata: data?.contentType.metadatas ?? {},\n }),\n });\n\n const [updateContentTypeConfiguration] = useUpdateContentTypeConfigurationMutation();\n const handleSubmit: FormProps<FormData>['onSubmit'] = async (data) => {\n try {\n trackUsage('willSaveContentTypeLayout');\n const layoutData = data.layout ?? [];\n /**\n * We reconstruct the metadatas object by taking the existing edit 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(edit.metadatas).reduce<Metadatas>((acc, [name, editMeta]) => {\n const { mainField: _mainField, ...listMeta } = list.metadatas[name];\n\n const { label, sortable } = layoutData.find((field) => field.name === name) ?? {};\n\n acc[name] = {\n edit: editMeta,\n list: {\n ...listMeta,\n label: label || listMeta.label,\n sortable: sortable || listMeta.sortable,\n },\n };\n\n return acc;\n }, {});\n\n const res = await updateContentTypeConfiguration({\n layouts: {\n edit: edit.layout.flatMap((panel) =>\n panel.map((row) => row.map(({ name, size }) => ({ name, size })))\n ),\n list: layoutData.map((field) => field.name),\n },\n settings: setIn(data.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n setDisplayedHeaderNames(layoutData.map((field) => field.name));\n trackUsage('didEditListSettings');\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 (err) {\n console.error(err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const initialValues = React.useMemo(() => {\n const headerNames =\n displayedHeaderNames && displayedHeaderNames.length > 0\n ? displayedHeaderNames\n : list.layout.map((field) => field.name);\n\n const headerMetadatas = headerNames.reduce<ListLayout['metadatas']>((acc, name) => {\n acc[name] = metadata[name]?.list ?? list.metadatas[name] ?? { label: name };\n return acc;\n }, {});\n\n return {\n layout: convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas).map(\n ({ label, sortable, name }) => ({\n label: typeof label === 'string' ? label : formatMessage(label),\n sortable,\n name,\n })\n ),\n settings: list.settings,\n } satisfies FormData;\n }, [formatMessage, list, displayedHeaderNames, schema, metadata]);\n\n if (collectionType === SINGLE_TYPES) {\n return <Navigate to={`/single-types/${model}`} />;\n }\n\n if (isLoadingLayout) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{`Configure ${list.settings.displayName} List View`}</Page.Title>\n <Main>\n <Form initialValues={initialValues} onSubmit={handleSubmit} method=\"PUT\">\n <Header\n collectionType={collectionType}\n model={model}\n name={list.settings.displayName ?? ''}\n />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n position=\"relative\"\n >\n <Settings />\n <Divider />\n <SortDisplayedFields />\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </Layouts.Root>\n );\n};\n\nconst ProtectedListConfiguration = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListConfiguration key={slug} />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListConfiguration, ListConfiguration };\nexport type { FormData };\n"],"names":["ListConfiguration","formatMessage","useIntl","trackUsage","useTracking","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","model","collectionType","schema","useDoc","isLoading","isLoadingLayout","list","edit","useDocLayout","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","metadata","useGetContentTypeConfigurationQuery","selectFromResult","data","contentType","metadatas","updateContentTypeConfiguration","useUpdateContentTypeConfigurationMutation","handleSubmit","layoutData","layout","meta","Object","entries","reduce","acc","name","editMeta","mainField","_mainField","listMeta","label","sortable","find","field","res","layouts","flatMap","panel","map","row","size","settings","setIn","undefined","uid","type","message","id","defaultMessage","error","err","console","initialValues","React","useMemo","headerNames","length","headerMetadatas","convertListLayoutToFieldLayouts","attributes","SINGLE_TYPES","_jsx","Navigate","to","Page","Loading","_jsxs","Layouts","Root","Title","displayName","Main","Form","onSubmit","method","Header","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","position","Settings","Divider","SortDisplayedFields","ProtectedListConfiguration","slug","useParams","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListConfigurationPage.mjs","sources":["../../../../admin/src/pages/ListConfiguration/ListConfigurationPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Form,\n type FormProps,\n useNotification,\n useScopedPersistentState,\n useTracking,\n useAPIErrorHandler,\n Page,\n Layouts,\n} from '@strapi/admin/strapi-admin';\nimport { Divider, Flex, Main } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { Navigate, useParams } from 'react-router-dom';\n\nimport { SINGLE_TYPES } from '../../constants/collections';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n convertListLayoutToFieldLayouts,\n type ListFieldLayout,\n type ListLayout,\n useDocLayout,\n} from '../../hooks/useDocumentLayout';\nimport { useTypedSelector } from '../../modules/hooks';\nimport {\n useGetContentTypeConfigurationQuery,\n useUpdateContentTypeConfigurationMutation,\n} from '../../services/contentTypes';\nimport { setIn } from '../../utils/objects';\n\nimport { Header } from './components/Header';\nimport { Settings } from './components/Settings';\nimport { SortDisplayedFields } from './components/SortDisplayedFields';\n\nimport type { Metadatas } from '../../../../shared/contracts/content-types';\n\ninterface FormData extends Pick<ListLayout, 'settings'> {\n layout: Array<Pick<ListFieldLayout, 'sortable' | 'name'> & { label: string }>;\n}\n\nconst ListConfiguration = () => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { model, collectionType, schema } = useDoc();\n\n const { isLoading: isLoadingLayout, list, edit, listViewConversionContext } = useDocLayout();\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({\n metadata: data?.contentType.metadatas ?? {},\n }),\n });\n\n const [updateContentTypeConfiguration] = useUpdateContentTypeConfigurationMutation();\n const handleSubmit: FormProps<FormData>['onSubmit'] = async (data) => {\n try {\n trackUsage('willSaveContentTypeLayout');\n const layoutData = data.layout ?? [];\n /**\n * We reconstruct the metadatas object by taking the existing edit 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(edit.metadatas).reduce<Metadatas>((acc, [name, editMeta]) => {\n const { mainField: _mainField, ...listMeta } = list.metadatas[name];\n\n const { label, sortable } = layoutData.find((field) => field.name === name) ?? {};\n\n acc[name] = {\n edit: editMeta,\n list: {\n ...listMeta,\n label: label || listMeta.label,\n sortable: sortable || listMeta.sortable,\n },\n };\n\n return acc;\n }, {});\n\n const res = await updateContentTypeConfiguration({\n layouts: {\n edit: edit.layout.flatMap((panel) =>\n panel.map((row) => row.map(({ name, size }) => ({ name, size })))\n ),\n list: layoutData.map((field) => field.name),\n },\n settings: setIn(data.settings, 'displayName', undefined),\n metadatas: meta,\n uid: model,\n });\n\n if ('data' in res) {\n setDisplayedHeaderNames(layoutData.map((field) => field.name));\n trackUsage('didEditListSettings');\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 (err) {\n console.error(err);\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n });\n }\n };\n\n const initialValues = React.useMemo(() => {\n const headerNames =\n displayedHeaderNames && displayedHeaderNames.length > 0\n ? displayedHeaderNames\n : list.layout.map((field) => field.name);\n\n const headerMetadatas = headerNames.reduce<ListLayout['metadatas']>((acc, name) => {\n acc[name] = metadata[name]?.list ?? list.metadatas[name] ?? { label: name };\n return acc;\n }, {});\n\n /**\n * Same context as `formatListLayout` / `ListViewPage#displayedHeaders` so `getMainField`\n * can resolve component and relation list columns (see #25509, #25872).\n */\n const listFieldLayouts = listViewConversionContext\n ? convertListLayoutToFieldLayouts(\n headerNames,\n schema?.attributes,\n headerMetadatas,\n {\n configurations: listViewConversionContext.componentConfigurations,\n schemas: listViewConversionContext.componentSchemas,\n },\n listViewConversionContext.contentTypeSchemas\n )\n : convertListLayoutToFieldLayouts(headerNames, schema?.attributes, headerMetadatas);\n\n return {\n layout: listFieldLayouts.map(({ label, sortable, name }) => ({\n label: typeof label === 'string' ? label : formatMessage(label),\n sortable,\n name,\n })),\n settings: list.settings,\n } satisfies FormData;\n }, [formatMessage, list, displayedHeaderNames, schema, metadata, listViewConversionContext]);\n\n if (collectionType === SINGLE_TYPES) {\n return <Navigate to={`/single-types/${model}`} />;\n }\n\n if (isLoadingLayout) {\n return <Page.Loading />;\n }\n\n return (\n <Layouts.Root>\n <Page.Title>{`Configure ${list.settings.displayName} List View`}</Page.Title>\n <Main>\n <Form initialValues={initialValues} onSubmit={handleSubmit} method=\"PUT\">\n <Header\n collectionType={collectionType}\n model={model}\n name={list.settings.displayName ?? ''}\n />\n <Layouts.Content>\n <Flex\n alignItems=\"stretch\"\n background=\"neutral0\"\n direction=\"column\"\n gap={6}\n hasRadius\n shadow=\"tableShadow\"\n paddingTop={6}\n paddingBottom={6}\n paddingLeft={7}\n paddingRight={7}\n position=\"relative\"\n >\n <Settings />\n <Divider />\n <SortDisplayedFields />\n </Flex>\n </Layouts.Content>\n </Form>\n </Main>\n </Layouts.Root>\n );\n};\n\nconst ProtectedListConfiguration = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions.contentManager?.collectionTypesConfigurations\n );\n\n return (\n <Page.Protect permissions={permissions}>\n <ListConfiguration key={slug} />\n </Page.Protect>\n );\n};\n\nexport { ProtectedListConfiguration, ListConfiguration };\nexport type { FormData };\n"],"names":["ListConfiguration","formatMessage","useIntl","trackUsage","useTracking","toggleNotification","useNotification","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","model","collectionType","schema","useDoc","isLoading","isLoadingLayout","list","edit","listViewConversionContext","useDocLayout","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","metadata","useGetContentTypeConfigurationQuery","selectFromResult","data","contentType","metadatas","updateContentTypeConfiguration","useUpdateContentTypeConfigurationMutation","handleSubmit","layoutData","layout","meta","Object","entries","reduce","acc","name","editMeta","mainField","_mainField","listMeta","label","sortable","find","field","res","layouts","flatMap","panel","map","row","size","settings","setIn","undefined","uid","type","message","id","defaultMessage","error","err","console","initialValues","React","useMemo","headerNames","length","headerMetadatas","listFieldLayouts","convertListLayoutToFieldLayouts","attributes","configurations","componentConfigurations","schemas","componentSchemas","contentTypeSchemas","SINGLE_TYPES","_jsx","Navigate","to","Page","Loading","_jsxs","Layouts","Root","Title","displayName","Main","Form","onSubmit","method","Header","Content","Flex","alignItems","background","direction","gap","hasRadius","shadow","paddingTop","paddingBottom","paddingLeft","paddingRight","position","Settings","Divider","SortDisplayedFields","ProtectedListConfiguration","slug","useParams","permissions","useTypedSelector","state","admin_app","contentManager","collectionTypesConfigurations","Protect"],"mappings":"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"}
|
|
@@ -322,6 +322,7 @@ const ListViewPage = ()=>{
|
|
|
322
322
|
});
|
|
323
323
|
const actions = list.settings.filterable && schema ? /*#__PURE__*/ jsxRuntime.jsxs(Filters.listViewFilters.Root, {
|
|
324
324
|
schema: schema,
|
|
325
|
+
layout: list,
|
|
325
326
|
children: [
|
|
326
327
|
/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Action, {
|
|
327
328
|
endActions: endActions,
|