@strapi/content-manager 5.60.0 → 5.61.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/customOrder.js +14 -0
- package/dist/admin/constants/customOrder.js.map +1 -0
- package/dist/admin/constants/customOrder.mjs +10 -0
- package/dist/admin/constants/customOrder.mjs.map +1 -0
- package/dist/admin/hooks/useDocument.js +22 -11
- package/dist/admin/hooks/useDocument.js.map +1 -1
- package/dist/admin/hooks/useDocument.mjs +22 -11
- package/dist/admin/hooks/useDocument.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/hooks/useHasBeenNearViewport.js +70 -0
- package/dist/admin/hooks/useHasBeenNearViewport.js.map +1 -0
- package/dist/admin/hooks/useHasBeenNearViewport.mjs +46 -0
- package/dist/admin/hooks/useHasBeenNearViewport.mjs.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +102 -32
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +104 -35
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +20 -17
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +20 -17
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +15 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +17 -3
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js +21 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs +22 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +4 -7
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +4 -7
- package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +46 -10
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +47 -11
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +201 -51
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +202 -53
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +31 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +31 -2
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +196 -132
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +196 -132
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/CustomOrder.js +571 -0
- package/dist/admin/pages/ListView/components/CustomOrder.js.map +1 -0
- package/dist/admin/pages/ListView/components/CustomOrder.mjs +546 -0
- package/dist/admin/pages/ListView/components/CustomOrder.mjs.map +1 -0
- package/dist/admin/pages/ListView/components/TableActions.js +4 -1
- package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs +4 -1
- package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
- package/dist/admin/services/documents.js +22 -1
- package/dist/admin/services/documents.js.map +1 -1
- package/dist/admin/services/documents.mjs +21 -2
- package/dist/admin/services/documents.mjs.map +1 -1
- package/dist/admin/src/constants/customOrder.d.ts +8 -0
- package/dist/admin/src/exports.d.ts +1 -1
- package/dist/admin/src/hooks/useDocument.d.ts +4 -0
- package/dist/admin/src/hooks/useDocumentLayout.d.ts +6 -2
- package/dist/admin/src/hooks/useHasBeenNearViewport.d.ts +13 -0
- package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +13 -1
- package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +11 -1
- package/dist/admin/src/pages/ListView/components/CustomOrder.d.ts +72 -0
- package/dist/admin/src/services/documents.d.ts +10 -2
- package/dist/admin/translations/en.json.js +9 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +9 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/audit-logs.js +36 -0
- package/dist/server/audit-logs.js.map +1 -0
- package/dist/server/audit-logs.mjs +33 -0
- package/dist/server/audit-logs.mjs.map +1 -0
- package/dist/server/bootstrap.js +8 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +8 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/collection-types.js +8 -0
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +8 -0
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/controllers/content-types.js +15 -0
- package/dist/server/controllers/content-types.js.map +1 -1
- package/dist/server/controllers/content-types.mjs +16 -1
- package/dist/server/controllers/content-types.mjs.map +1 -1
- package/dist/server/controllers/index.js +3 -1
- package/dist/server/controllers/index.js.map +1 -1
- package/dist/server/controllers/index.mjs +2 -0
- package/dist/server/controllers/index.mjs.map +1 -1
- package/dist/server/controllers/relations.js +5 -1
- package/dist/server/controllers/relations.js.map +1 -1
- package/dist/server/controllers/relations.mjs +5 -1
- package/dist/server/controllers/relations.mjs.map +1 -1
- package/dist/server/controllers/single-types.js +10 -1
- package/dist/server/controllers/single-types.js.map +1 -1
- package/dist/server/controllers/single-types.mjs +10 -1
- package/dist/server/controllers/single-types.mjs.map +1 -1
- package/dist/server/controllers/validation/model-configuration.js +2 -1
- package/dist/server/controllers/validation/model-configuration.js.map +1 -1
- package/dist/server/controllers/validation/model-configuration.mjs +2 -1
- package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
- package/dist/server/custom-order/constants.js +21 -0
- package/dist/server/custom-order/constants.js.map +1 -0
- package/dist/server/custom-order/constants.mjs +17 -0
- package/dist/server/custom-order/constants.mjs.map +1 -0
- package/dist/server/custom-order/controllers/custom-order.js +77 -0
- package/dist/server/custom-order/controllers/custom-order.js.map +1 -0
- package/dist/server/custom-order/controllers/custom-order.mjs +75 -0
- package/dist/server/custom-order/controllers/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/controllers/index.js +10 -0
- package/dist/server/custom-order/controllers/index.js.map +1 -0
- package/dist/server/custom-order/controllers/index.mjs +8 -0
- package/dist/server/custom-order/controllers/index.mjs.map +1 -0
- package/dist/server/custom-order/index.js +71 -0
- package/dist/server/custom-order/index.js.map +1 -0
- package/dist/server/custom-order/index.mjs +69 -0
- package/dist/server/custom-order/index.mjs.map +1 -0
- package/dist/server/custom-order/routes/custom-order.js +38 -0
- package/dist/server/custom-order/routes/custom-order.js.map +1 -0
- package/dist/server/custom-order/routes/custom-order.mjs +36 -0
- package/dist/server/custom-order/routes/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/routes/index.js +13 -0
- package/dist/server/custom-order/routes/index.js.map +1 -0
- package/dist/server/custom-order/routes/index.mjs +11 -0
- package/dist/server/custom-order/routes/index.mjs.map +1 -0
- package/dist/server/custom-order/services/custom-order.js +286 -0
- package/dist/server/custom-order/services/custom-order.js.map +1 -0
- package/dist/server/custom-order/services/custom-order.mjs +284 -0
- package/dist/server/custom-order/services/custom-order.mjs.map +1 -0
- package/dist/server/custom-order/services/document-middleware.js +83 -0
- package/dist/server/custom-order/services/document-middleware.js.map +1 -0
- package/dist/server/custom-order/services/document-middleware.mjs +81 -0
- package/dist/server/custom-order/services/document-middleware.mjs.map +1 -0
- package/dist/server/custom-order/services/index.js +10 -0
- package/dist/server/custom-order/services/index.js.map +1 -0
- package/dist/server/custom-order/services/index.mjs +8 -0
- package/dist/server/custom-order/services/index.mjs.map +1 -0
- package/dist/server/custom-order/services/utils.js +152 -0
- package/dist/server/custom-order/services/utils.js.map +1 -0
- package/dist/server/custom-order/services/utils.mjs +148 -0
- package/dist/server/custom-order/services/utils.mjs.map +1 -0
- package/dist/server/custom-order/utils.js +13 -0
- package/dist/server/custom-order/utils.js.map +1 -0
- package/dist/server/custom-order/utils.mjs +10 -0
- package/dist/server/custom-order/utils.mjs.map +1 -0
- package/dist/server/history/constants.js +2 -1
- package/dist/server/history/constants.js.map +1 -1
- package/dist/server/history/constants.mjs +2 -1
- package/dist/server/history/constants.mjs.map +1 -1
- package/dist/server/history/controllers/history-version.js +6 -2
- package/dist/server/history/controllers/history-version.js.map +1 -1
- package/dist/server/history/controllers/history-version.mjs +6 -2
- package/dist/server/history/controllers/history-version.mjs.map +1 -1
- package/dist/server/history/services/history.js +23 -6
- package/dist/server/history/services/history.js.map +1 -1
- package/dist/server/history/services/history.mjs +24 -7
- package/dist/server/history/services/history.mjs.map +1 -1
- package/dist/server/history/services/lifecycles.js +2 -16
- package/dist/server/history/services/lifecycles.js.map +1 -1
- package/dist/server/history/services/lifecycles.mjs +2 -16
- package/dist/server/history/services/lifecycles.mjs.map +1 -1
- package/dist/server/register.js +4 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +4 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/index.js +3 -1
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/index.mjs +2 -0
- package/dist/server/routes/index.mjs.map +1 -1
- package/dist/server/services/content-types.js +2 -2
- package/dist/server/services/content-types.js.map +1 -1
- package/dist/server/services/content-types.mjs +2 -2
- package/dist/server/services/content-types.mjs.map +1 -1
- package/dist/server/services/document-manager.js +13 -0
- package/dist/server/services/document-manager.js.map +1 -1
- package/dist/server/services/document-manager.mjs +14 -1
- package/dist/server/services/document-manager.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +2 -0
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/services/utils/configuration/settings.js +2 -1
- package/dist/server/services/utils/configuration/settings.js.map +1 -1
- package/dist/server/services/utils/configuration/settings.mjs +2 -1
- package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
- package/dist/server/src/audit-logs.d.ts +40 -0
- package/dist/server/src/audit-logs.d.ts.map +1 -0
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/controllers/content-types.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +21 -3
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/controllers/relations.d.ts +19 -1
- package/dist/server/src/controllers/relations.d.ts.map +1 -1
- package/dist/server/src/controllers/single-types.d.ts +1 -1
- package/dist/server/src/controllers/single-types.d.ts.map +1 -1
- package/dist/server/src/custom-order/constants.d.ts +18 -0
- package/dist/server/src/custom-order/constants.d.ts.map +1 -0
- package/dist/server/src/custom-order/controllers/custom-order.d.ts +8 -0
- package/dist/server/src/custom-order/controllers/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/controllers/index.d.ts +3 -0
- package/dist/server/src/custom-order/controllers/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/index.d.ts +8 -0
- package/dist/server/src/custom-order/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/routes/custom-order.d.ts +4 -0
- package/dist/server/src/custom-order/routes/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/routes/index.d.ts +10 -0
- package/dist/server/src/custom-order/routes/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/custom-order.d.ts +43 -0
- package/dist/server/src/custom-order/services/custom-order.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/document-middleware.d.ts +16 -0
- package/dist/server/src/custom-order/services/document-middleware.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/index.d.ts +24 -0
- package/dist/server/src/custom-order/services/index.d.ts.map +1 -0
- package/dist/server/src/custom-order/services/utils.d.ts +34 -0
- package/dist/server/src/custom-order/services/utils.d.ts.map +1 -0
- package/dist/server/src/custom-order/utils.d.ts +6 -0
- package/dist/server/src/custom-order/utils.d.ts.map +1 -0
- package/dist/server/src/history/constants.d.ts.map +1 -1
- package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
- package/dist/server/src/history/services/history.d.ts.map +1 -1
- package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +22 -6
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/index.d.ts.map +1 -1
- package/dist/server/src/services/content-types.d.ts +1 -3
- package/dist/server/src/services/content-types.d.ts.map +1 -1
- package/dist/server/src/services/document-manager.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +1 -3
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
- package/dist/shared/contracts/content-types.d.ts +5 -0
- package/dist/shared/contracts/content-types.d.ts.map +1 -1
- package/dist/shared/contracts/custom-order.d.ts +33 -0
- package/dist/shared/contracts/custom-order.d.ts.map +1 -0
- package/dist/shared/contracts/custom-order.js +3 -0
- package/dist/shared/contracts/custom-order.js.map +1 -0
- package/dist/shared/contracts/custom-order.mjs +2 -0
- package/dist/shared/contracts/custom-order.mjs.map +1 -0
- package/dist/shared/contracts/history-versions.d.ts +0 -1
- package/dist/shared/contracts/history-versions.d.ts.map +1 -1
- package/dist/shared/contracts/index.d.ts +1 -0
- package/dist/shared/contracts/index.d.ts.map +1 -1
- package/dist/shared/contracts/index.js +2 -0
- package/dist/shared/contracts/index.js.map +1 -1
- package/dist/shared/contracts/index.mjs +2 -0
- package/dist/shared/contracts/index.mjs.map +1 -1
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <Grid.Root key={field.name} gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <ResponsiveGridRoot\n key={row.map((field) => field.name).join('.')}\n gap={{ initial: 6, medium: 4 }}\n >\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps };\n"],"names":["ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","React","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","name","label","id","defaultMessage","_jsx","Flex","direction","alignItems","gap","map","panel","some","row","field","type","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FormLayout.mjs","sources":["../../../../../admin/src/pages/EditView/components/FormLayout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, BoxProps, Flex, Grid } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { EditLayout } from '../../../hooks/useDocumentLayout';\nimport { NEAR_VIEWPORT_MARGIN, getScrollParent } from '../../../hooks/useHasBeenNearViewport';\n\nimport { InputRenderer } from './InputRenderer';\n\nimport type { UseDocument } from '../../../hooks/useDocument';\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype LayoutField = EditLayout['layout'][number][number][number];\n\n/**\n * Rough rendered heights, only used to size placeholders so the scrollbar stays sensible.\n */\nconst ESTIMATED_HEIGHT: Partial<Record<LayoutField['type'], number>> = {\n richtext: 320,\n blocks: 320,\n json: 240,\n component: 240,\n dynamiczone: 160,\n relation: 120,\n media: 160,\n text: 120,\n};\nconst DEFAULT_ESTIMATED_HEIGHT = 80;\n\n/* -------------------------------------------------------------------------------------------------\n * Idle mount queue\n * -----------------------------------------------------------------------------------------------*/\n\ntype ScheduleMount = (mount: () => void) => () => void;\n\ninterface IdleMountQueue {\n schedule: ScheduleMount;\n dispose: () => void;\n}\n\nconst requestIdle = (callback: () => void): number =>\n typeof window.requestIdleCallback === 'function'\n ? window.requestIdleCallback(callback, { timeout: 2000 })\n : window.setTimeout(callback, 16);\n\nconst cancelIdle = (handle: number) =>\n typeof window.cancelIdleCallback === 'function'\n ? window.cancelIdleCallback(handle)\n : window.clearTimeout(handle);\n\n/**\n * Mounts the rows that weren't needed for the first paint, one per idle period, in the order\n * they were scheduled (top to bottom). Rows are then already rendered when the user scrolls to\n * them, and the browser search finds every field.\n */\nconst createIdleMountQueue = (): IdleMountQueue => {\n let queue: Array<() => void> = [];\n let handle: number | null = null;\n\n const flush = () => {\n handle = null;\n queue.shift()?.();\n\n if (queue.length > 0) {\n handle = requestIdle(flush);\n }\n };\n\n return {\n schedule: (mount) => {\n queue.push(mount);\n\n if (handle === null) {\n handle = requestIdle(flush);\n }\n\n return () => {\n queue = queue.filter((scheduled) => scheduled !== mount);\n };\n },\n dispose: () => {\n queue = [];\n\n if (handle !== null) {\n cancelIdle(handle);\n handle = null;\n }\n },\n };\n};\n\nconst IdleMountContext = React.createContext<ScheduleMount | null>(null);\n\nconst useIdleMountQueue = () => {\n const [queue] = React.useState(createIdleMountQueue);\n\n React.useEffect(() => queue.dispose, [queue]);\n\n return queue.schedule;\n};\n\n/* -------------------------------------------------------------------------------------------------\n * LazyFormRow\n * -----------------------------------------------------------------------------------------------*/\n\ntype Components = ReturnType<UseDocument>['components'];\ntype Attribute = LayoutField['attribute'];\n\n/**\n * Some inputs set a value when they mount: a required UID fetches its default value, and custom\n * fields may set a default. Their rows are mounted with the page, as they always were, so that\n * saving right after the page loads doesn't miss those values. Non-repeatable components are\n * expanded by default, so the inputs they contain count too.\n */\nconst hasMountSideEffects = (attribute: Attribute, components: Components, depth = 0): boolean => {\n if ((attribute.type === 'uid' && attribute.required) || 'customField' in attribute) {\n return true;\n }\n\n if (attribute.type === 'component' && !attribute.repeatable && depth < 10) {\n return Object.values(components[attribute.component]?.attributes ?? {}).some((nested) =>\n hasMountSideEffects(nested as Attribute, components, depth + 1)\n );\n }\n\n return false;\n};\n\ninterface LazyFormRowProps {\n fields: Pick<LayoutField, 'name' | 'type'>[];\n mountImmediately?: boolean;\n children: React.ReactNode;\n}\n\n/**\n * Mounts its children once they get close to the viewport, or in the background when the\n * browser is idle, then keeps them mounted. Rendering every field of a large content type\n * upfront is what makes the edit view slow: the cost of the first render should depend on\n * the screen, not on the size of the model.\n */\nconst LazyFormRow = ({ fields, mountImmediately = false, children }: LazyFormRowProps) => {\n const scheduleMount = React.useContext(IdleMountContext);\n const placeholderRef = React.useRef<HTMLDivElement>(null);\n const [isVisible, setIsVisible] = React.useState(\n () => mountImmediately || typeof IntersectionObserver === 'undefined'\n );\n\n // A field in error has to be mounted so the error is displayed and can receive the focus.\n const hasError = useForm('LazyFormRow', (state) =>\n fields.some(({ name }) => name in state.errors)\n );\n\n // Once mounted for an error, the row stays mounted when the errors are cleared (every\n // validation starts by clearing them), so its state (e.g. open blocks) is preserved.\n React.useEffect(() => {\n if (hasError) {\n setIsVisible(true);\n }\n }, [hasError]);\n\n const shouldMount = isVisible || hasError;\n\n React.useEffect(() => {\n const placeholder = placeholderRef.current;\n\n if (shouldMount || !placeholder) {\n return;\n }\n\n const observer = new IntersectionObserver(\n (entries) => {\n if (entries.some((entry) => entry.isIntersecting)) {\n setIsVisible(true);\n }\n },\n { root: getScrollParent(placeholder), rootMargin: NEAR_VIEWPORT_MARGIN }\n );\n\n observer.observe(placeholder);\n\n // Low priority: user input interrupts the render of a row mounted in the background.\n const cancelIdleMount = scheduleMount?.(() =>\n React.startTransition(() => {\n setIsVisible(true);\n })\n );\n\n return () => {\n observer.disconnect();\n cancelIdleMount?.();\n };\n }, [shouldMount, scheduleMount]);\n\n if (shouldMount) {\n return <>{children}</>;\n }\n\n const height = Math.max(\n ...fields.map(({ type }) => ESTIMATED_HEIGHT[type] ?? DEFAULT_ESTIMATED_HEIGHT)\n );\n\n return <div ref={placeholderRef} style={{ height }} aria-hidden />;\n};\n\nexport const ResponsiveGridRoot = styled(Grid.Root)`\n container-type: inline-size;\n`;\n\nexport const ResponsiveGridItem =\n /**\n * TODO:\n * JSDOM cannot handle container queries.\n * This is a temporary workaround so that tests do not fail in the CI when jestdom throws an error\n * for failing to parse the stylesheet.\n */\n process.env.NODE_ENV !== 'test'\n ? styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n ${({ theme }) => theme.breakpoints.medium} {\n ${({ col }) => col && `grid-column: span ${col};`}\n }\n `\n : styled(Grid.Item)<{ col: number }>`\n grid-column: span 12;\n `;\n\nconst panelStyles = {\n padding: {\n initial: 4,\n medium: 6,\n },\n borderColor: 'neutral150',\n background: 'neutral0',\n hasRadius: true,\n shadow: 'tableShadow',\n} satisfies BoxProps;\n\ninterface FormLayoutProps extends Pick<EditLayout, 'layout'> {\n hasBackground?: boolean;\n document: ReturnType<UseDocument>;\n}\n\nconst FormLayout = React.memo(({ layout, document, hasBackground = true }: FormLayoutProps) => {\n const { formatMessage } = useIntl();\n const scheduleMount = useIdleMountQueue();\n const modelUid = document.schema?.uid;\n\n const getLabel = (name: string, label: string) => {\n return formatMessage({\n id: `content-manager.content-types.${modelUid}.${name}`,\n defaultMessage: label,\n });\n };\n\n return (\n <IdleMountContext.Provider value={scheduleMount}>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {layout.map((panel) => {\n if (panel.some((row) => row.some((field) => field.type === 'dynamiczone'))) {\n const [row] = panel;\n const [field] = row;\n\n return (\n <LazyFormRow\n key={field.name}\n fields={[field]}\n mountImmediately={hasMountSideEffects(field.attribute, document.components)}\n >\n <Grid.Root gap={4}>\n <Grid.Item col={12} s={12} xs={12} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n {...field}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </Grid.Item>\n </Grid.Root>\n </LazyFormRow>\n );\n }\n\n return (\n <Box\n key={panel.flatMap((row) => row.map((field) => field.name)).join('.')}\n {...(hasBackground && panelStyles)}\n >\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6}>\n {panel.map((row) => {\n return (\n <LazyFormRow\n key={row.map((field) => field.name).join('.')}\n fields={row}\n mountImmediately={row.some((field) =>\n hasMountSideEffects(field.attribute, document.components)\n )}\n >\n <ResponsiveGridRoot gap={{ initial: 6, medium: 4 }}>\n {row.map(({ size, ...field }) => {\n return (\n <ResponsiveGridItem\n col={size}\n key={field.name}\n s={12}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\n <InputRenderer\n {...field}\n size={size}\n label={getLabel(field.name, field.label)}\n document={document}\n />\n </ResponsiveGridItem>\n );\n })}\n </ResponsiveGridRoot>\n </LazyFormRow>\n );\n })}\n </Flex>\n </Box>\n );\n })}\n </Flex>\n </IdleMountContext.Provider>\n );\n});\n\nFormLayout.displayName = 'FormLayout';\n\nexport { FormLayout, FormLayoutProps, hasMountSideEffects };\n"],"names":["ESTIMATED_HEIGHT","richtext","blocks","json","component","dynamiczone","relation","media","text","DEFAULT_ESTIMATED_HEIGHT","requestIdle","callback","window","requestIdleCallback","timeout","setTimeout","cancelIdle","handle","cancelIdleCallback","clearTimeout","createIdleMountQueue","queue","flush","shift","length","schedule","mount","push","filter","scheduled","dispose","IdleMountContext","React","createContext","useIdleMountQueue","useState","useEffect","hasMountSideEffects","attribute","components","depth","type","required","repeatable","Object","values","attributes","some","nested","LazyFormRow","fields","mountImmediately","children","scheduleMount","useContext","placeholderRef","useRef","isVisible","setIsVisible","IntersectionObserver","hasError","useForm","state","name","errors","shouldMount","placeholder","current","observer","entries","entry","isIntersecting","root","getScrollParent","rootMargin","NEAR_VIEWPORT_MARGIN","observe","cancelIdleMount","startTransition","disconnect","_jsx","_Fragment","height","Math","max","map","div","ref","style","aria-hidden","ResponsiveGridRoot","styled","Grid","Root","ResponsiveGridItem","process","env","NODE_ENV","Item","theme","breakpoints","medium","col","panelStyles","padding","initial","borderColor","background","hasRadius","shadow","FormLayout","memo","layout","document","hasBackground","formatMessage","useIntl","modelUid","schema","uid","getLabel","label","id","defaultMessage","Provider","value","Flex","direction","alignItems","gap","panel","row","field","s","xs","InputRenderer","Box","size","join","flatMap","displayName"],"mappings":"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"}
|
|
@@ -5,6 +5,8 @@ var React = require('react');
|
|
|
5
5
|
var strapiAdmin = require('@strapi/admin/strapi-admin');
|
|
6
6
|
var designSystem = require('@strapi/design-system');
|
|
7
7
|
var reactIntl = require('react-intl');
|
|
8
|
+
var collections = require('../../../constants/collections.js');
|
|
9
|
+
var customOrder = require('../../../constants/customOrder.js');
|
|
8
10
|
var useDocument = require('../../../hooks/useDocument.js');
|
|
9
11
|
var translations = require('../../../utils/translations.js');
|
|
10
12
|
|
|
@@ -42,8 +44,10 @@ const Settings = ()=>{
|
|
|
42
44
|
const formatter = designSystem.useCollator(locale, {
|
|
43
45
|
sensitivity: 'base'
|
|
44
46
|
});
|
|
45
|
-
const { schema } = useDocument.useDoc();
|
|
47
|
+
const { schema, collectionType } = useDocument.useDoc();
|
|
46
48
|
const layout = strapiAdmin.useForm('Settings', (state)=>state.values.layout ?? []);
|
|
49
|
+
const hasCustomOrder = strapiAdmin.useForm('Settings', (state)=>state.values.settings.customOrder);
|
|
50
|
+
const canUseCustomOrder = collectionType === collections.COLLECTION_TYPES && customOrder.isCustomOrderFeatureEnabled();
|
|
47
51
|
const currentSortBy = strapiAdmin.useForm('Settings', (state)=>state.values.settings.defaultSortBy);
|
|
48
52
|
const onChange = strapiAdmin.useForm('Settings', (state)=>state.onChange);
|
|
49
53
|
const sortOptions = React__namespace.useMemo(()=>Object.values(layout).reduce((acc, field)=>{
|
|
@@ -69,10 +73,17 @@ const Settings = ()=>{
|
|
|
69
73
|
onChange,
|
|
70
74
|
sortOptionsSorted
|
|
71
75
|
]);
|
|
72
|
-
const formLayout = React__namespace.useMemo(()=>
|
|
76
|
+
const formLayout = React__namespace.useMemo(()=>[
|
|
77
|
+
...SETTINGS_FORM_LAYOUT,
|
|
78
|
+
...canUseCustomOrder ? [
|
|
79
|
+
CUSTOM_ORDER_FORM_LAYOUT
|
|
80
|
+
] : []
|
|
81
|
+
].map((row)=>row.map((field)=>{
|
|
73
82
|
if (field.type === 'enumeration') {
|
|
74
83
|
return {
|
|
75
84
|
...field,
|
|
85
|
+
// The custom order takes over the default sort of the list
|
|
86
|
+
disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),
|
|
76
87
|
hint: field.hint ? formatMessage(field.hint) : undefined,
|
|
77
88
|
label: formatMessage(field.label),
|
|
78
89
|
options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options
|
|
@@ -85,7 +96,9 @@ const Settings = ()=>{
|
|
|
85
96
|
};
|
|
86
97
|
}
|
|
87
98
|
})), [
|
|
99
|
+
canUseCustomOrder,
|
|
88
100
|
formatMessage,
|
|
101
|
+
hasCustomOrder,
|
|
89
102
|
sortOptionsSorted
|
|
90
103
|
]);
|
|
91
104
|
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
@@ -197,6 +210,22 @@ const SETTINGS_FORM_LAYOUT = [
|
|
|
197
210
|
}
|
|
198
211
|
]
|
|
199
212
|
];
|
|
213
|
+
const CUSTOM_ORDER_FORM_LAYOUT = [
|
|
214
|
+
{
|
|
215
|
+
hint: {
|
|
216
|
+
id: translations.getTranslation('form.Input.customOrder.hint'),
|
|
217
|
+
defaultMessage: 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.'
|
|
218
|
+
},
|
|
219
|
+
label: {
|
|
220
|
+
id: translations.getTranslation('form.Input.customOrder'),
|
|
221
|
+
defaultMessage: 'Enable custom order'
|
|
222
|
+
},
|
|
223
|
+
name: 'settings.customOrder',
|
|
224
|
+
size: 6,
|
|
225
|
+
type: 'boolean'
|
|
226
|
+
}
|
|
227
|
+
];
|
|
228
|
+
const isDefaultSortField = (name)=>name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';
|
|
200
229
|
|
|
201
230
|
exports.Settings = Settings;
|
|
202
231
|
//# sourceMappingURL=Settings.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.js","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n SETTINGS_FORM_LAYOUT.map((row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as [top: EditFieldLayout[], bottom: EditFieldLayout[]],\n [formatMessage, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","useDoc","layout","useForm","state","values","currentSortBy","settings","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","map","row","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Settings.js","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES } from '../../../constants/collections';\nimport { isCustomOrderFeatureEnabled } from '../../../constants/customOrder';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema, collectionType } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const hasCustomOrder = useForm<FormData['settings']['customOrder']>(\n 'Settings',\n (state) => (state.values as FormData).settings.customOrder\n );\n const canUseCustomOrder = collectionType === COLLECTION_TYPES && isCustomOrderFeatureEnabled();\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n [...SETTINGS_FORM_LAYOUT, ...(canUseCustomOrder ? [CUSTOM_ORDER_FORM_LAYOUT] : [])].map(\n (row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n // The custom order takes over the default sort of the list\n disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options:\n field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as EditFieldLayout[][],\n [canUseCustomOrder, formatMessage, hasCustomOrder, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nconst CUSTOM_ORDER_FORM_LAYOUT: FormLayoutInputProps[] = [\n {\n hint: {\n id: getTranslation('form.Input.customOrder.hint'),\n defaultMessage:\n 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.',\n },\n label: {\n id: getTranslation('form.Input.customOrder'),\n defaultMessage: 'Enable custom order',\n },\n name: 'settings.customOrder',\n size: 6,\n type: 'boolean' as const,\n },\n];\n\nconst isDefaultSortField = (name: string) =>\n name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","collectionType","useDoc","layout","useForm","state","values","hasCustomOrder","settings","customOrder","canUseCustomOrder","COLLECTION_TYPES","isCustomOrderFeatureEnabled","currentSortBy","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","CUSTOM_ORDER_FORM_LAYOUT","map","row","disabled","isDefaultSortField","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAMA,6BAAAA,GAAgC,IAAIC,GAAAA,CAAI;AAC5C,IAAA,OAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA,WAAA;AACA,IAAA,MAAA;AACA,IAAA;AACD,CAAA,CAAA;AAOD,MAAMC,QAAAA,GAAW,IAAA;AACf,IAAA,MAAM,EAAEC,aAAa,EAAEC,MAAM,EAAE,GAAGC,iBAAAA,EAAAA;IAClC,MAAMC,SAAAA,GAAYC,yBAAYH,MAAAA,EAAQ;QACpCI,WAAAA,EAAa;AACf,KAAA,CAAA;AACA,IAAA,MAAM,EAAEC,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,EAAAA;IAEnC,MAAMC,MAAAA,GAASC,mBAAAA,CACb,UAAA,EACA,CAACC,KAAAA,GAAU,KAACA,CAAMC,MAAM,CAAcH,MAAM,IAAI,EAAE,CAAA;IAEpD,MAAMI,cAAAA,GAAiBH,mBAAAA,CACrB,UAAA,EACA,CAACC,KAAAA,GAAU,KAACA,CAAMC,MAAM,CAAcE,QAAQ,CAACC,WAAW,CAAA;IAE5D,MAAMC,iBAAAA,GAAoBT,mBAAmBU,4BAAAA,IAAoBC,uCAAAA,EAAAA;IACjE,MAAMC,aAAAA,GAAgBT,mBAAAA,CACpB,UAAA,EACA,CAACC,KAAAA,GAAU,KAACA,CAAMC,MAAM,CAAcE,QAAQ,CAACM,aAAa,CAAA;AAE9D,IAAA,MAAMC,WAAWX,mBAAAA,CAAQ,UAAA,EAAY,CAACC,KAAAA,GAAUA,MAAMU,QAAQ,CAAA;AAE9D,IAAA,MAAMC,WAAAA,GAAcC,gBAAAA,CAAMC,OAAO,CAC/B,IACEC,MAAAA,CAAOb,MAAM,CAACH,MAAAA,CAAAA,CAAQiB,MAAM,CAAe,CAACC,GAAAA,EAAKC,KAAAA,GAAAA;AAC/C,YAAA,IAAItB,MAAAA,IAAU,CAACT,6BAAAA,CAA8BgC,GAAG,CAACvB,MAAAA,CAAOwB,UAAU,CAACF,KAAAA,CAAMG,IAAI,CAAC,CAACC,IAAI,CAAA,EAAG;AACpFL,gBAAAA,GAAAA,CAAIM,IAAI,CAAC;AACPC,oBAAAA,KAAAA,EAAON,MAAMG,IAAI;oBACjBI,KAAAA,EAAO,OAAOP,KAAAA,CAAMO,KAAK,KAAK,QAAA,GAAWnC,cAAc4B,KAAAA,CAAMO,KAAK,CAAA,GAAIP,KAAAA,CAAMO;AAC9E,iBAAA,CAAA;AACF,YAAA;YAEA,OAAOR,GAAAA;AACT,QAAA,CAAA,EAAG,EAAE,CAAA,EACP;AAAC3B,QAAAA,aAAAA;AAAeS,QAAAA,MAAAA;AAAQH,QAAAA;AAAO,KAAA,CAAA;AAGjC,IAAA,MAAM8B,iBAAAA,GAAoBd,WAAAA,CAAYe,IAAI,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAMpC,SAAAA,CAAUqC,OAAO,CAACF,CAAAA,CAAEH,KAAK,EAAEI,EAAEJ,KAAK,CAAA,CAAA;AAEvFZ,IAAAA,gBAAAA,CAAMkB,SAAS,CAAC,IAAA;QACd,IAAIL,iBAAAA,CAAkBM,SAAS,CAAC,CAACC,GAAAA,GAAQA,IAAIT,KAAK,KAAKf,aAAAA,CAAAA,KAAmB,EAAC,EAAG;AAC5EE,YAAAA,QAAAA,CAAS,wBAAA,EAA0Be,iBAAiB,CAAC,CAAA,CAAE,EAAEF,KAAAA,CAAAA;AAC3D,QAAA;IACF,CAAA,EAAG;AAACf,QAAAA,aAAAA;AAAeE,QAAAA,QAAAA;AAAUe,QAAAA;AAAkB,KAAA,CAAA;AAE/C,IAAA,MAAMQ,UAAAA,GAAarB,gBAAAA,CAAMC,OAAO,CAC9B,IACE;AAAIqB,YAAAA,GAAAA,oBAAAA;eAA0B7B,iBAAAA,GAAoB;AAAC8B,gBAAAA;AAAyB,aAAA,GAAG;AAAI,SAAA,CAACC,GAAG,CACrF,CAACC,MACCA,GAAAA,CAAID,GAAG,CAAC,CAACnB,KAAAA,GAAAA;gBACP,IAAIA,KAAAA,CAAMI,IAAI,KAAK,aAAA,EAAe;oBAChC,OAAO;AACL,wBAAA,GAAGJ,KAAK;;AAERqB,wBAAAA,QAAAA,EAAUjC,iBAAAA,IAAqBH,cAAAA,IAAkBqC,kBAAAA,CAAmBtB,KAAAA,CAAMG,IAAI,CAAA;AAC9EoB,wBAAAA,IAAAA,EAAMvB,MAAMuB,IAAI,GAAGnD,aAAAA,CAAc4B,KAAAA,CAAMuB,IAAI,CAAA,GAAIC,SAAAA;wBAC/CjB,KAAAA,EAAOnC,aAAAA,CAAc4B,MAAMO,KAAK,CAAA;AAChCkB,wBAAAA,OAAAA,EACEzB,MAAMG,IAAI,KAAK,wBAAA,GAA2BK,iBAAAA,GAAoBR,MAAMyB;AACxE,qBAAA;gBACF,CAAA,MAAO;oBACL,OAAO;AACL,wBAAA,GAAGzB,KAAK;AACRuB,wBAAAA,IAAAA,EAAMvB,MAAMuB,IAAI,GAAGnD,aAAAA,CAAc4B,KAAAA,CAAMuB,IAAI,CAAA,GAAIC,SAAAA;wBAC/CjB,KAAAA,EAAOnC,aAAAA,CAAc4B,MAAMO,KAAK;AAClC,qBAAA;AACF,gBAAA;YACF,CAAA,CAAA,CAAA,EAEN;AAACnB,QAAAA,iBAAAA;AAAmBhB,QAAAA,aAAAA;AAAea,QAAAA,cAAAA;AAAgBuB,QAAAA;AAAkB,KAAA,CAAA;AAGvE,IAAA,qBACEkB,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,UAAAA,EAAW,SAAA;QAAUC,GAAAA,EAAK,CAAA;;0BACjDC,cAAA,CAACC,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,GAAAA,EAAI,IAAA;0BAC7B9D,aAAAA,CAAc;AACb+D,oBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,iCAAA,CAAA;oBACnBC,cAAAA,EAAgB;AAClB,iBAAA;;AAEF,0BAAAN,cAAA,CAACO,kBAAKC,IAAI,EAAA;gBAAcT,GAAAA,EAAK,CAAA;AAC1Bd,gBAAAA,QAAAA,EAAAA,UAAAA,CAAWG,GAAG,CAAC,CAACC,GAAAA,GACfA,GAAAA,CAAID,GAAG,CAAC,CAAC,EAAEqB,IAAI,EAAE,GAAGxC,KAAAA,EAAO,iBACzB+B,cAAA,CAACO,kBAAKG,IAAI,EAAA;4BAAkBC,EAAAA,EAAI,EAAA;4BAAIC,GAAAA,EAAKH,IAAAA;4BAAMZ,SAAAA,EAAU,QAAA;4BAASC,UAAAA,EAAW,SAAA;AAE3E,4BAAA,QAAA,gBAAAE,cAAA,CAACa,yBAAAA,EAAAA;AAAe,gCAAA,GAAG5C;;AAFLA,yBAAAA,EAAAA,KAAAA,CAAMG,IAAI,CAAA,CAAA;AAHjB,aAAA,EAAA,QAAA;;;AAYrB;AAEA,MAAMc,oBAAAA,GAAiD;AACrD,IAAA;AACE,QAAA;YACEV,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,mBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,qBAAA;YACNqC,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR,SAAA;AACA,QAAA;YACEG,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,oBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,qBAAA;YACNqC,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR,SAAA;AACA,QAAA;YACEG,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,wBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,mBAAA;YACNqC,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR;AACD,KAAA;AACD,IAAA;AACE,QAAA;YACEmB,IAAAA,EAAM;AACJY,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,yCAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACA9B,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,wBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,mBAAA;YACNsB,OAAAA,EAAS;AAAC,gBAAA,IAAA;AAAM,gBAAA,IAAA;AAAM,gBAAA,IAAA;AAAM,gBAAA;AAAM,aAAA,CAACN,GAAG,CAAC,CAACb,KAAAA,IAAW;AAAEA,oBAAAA,KAAAA;oBAAOC,KAAAA,EAAOD;iBAAM,CAAA,CAAA;YACzEkC,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR,SAAA;AACA,QAAA;YACEG,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,wBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,wBAAA;AACNsB,YAAAA,OAAAA,EAAS,EAAE;YACXe,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR,SAAA;AACA,QAAA;YACEG,KAAAA,EAAO;AACL4B,gBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,uBAAA,CAAA;gBACnBC,cAAAA,EAAgB;AAClB,aAAA;YACAlC,IAAAA,EAAM,2BAAA;YACNsB,OAAAA,EAAS;AAAC,gBAAA,KAAA;AAAO,gBAAA;AAAO,aAAA,CAACN,GAAG,CAAC,CAACb,KAAAA,IAAW;AAAEA,oBAAAA,KAAAA;oBAAOC,KAAAA,EAAOD;iBAAM,CAAA,CAAA;YAC/DkC,IAAAA,EAAM,CAAA;YACNpC,IAAAA,EAAM;AACR;AACD;AACF,CAAA;AAED,MAAMc,wBAAAA,GAAmD;AACvD,IAAA;QACEK,IAAAA,EAAM;AACJY,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,6BAAA,CAAA;YACnBC,cAAAA,EACE;AACJ,SAAA;QACA9B,KAAAA,EAAO;AACL4B,YAAAA,EAAAA,EAAIC,2BAAAA,CAAe,wBAAA,CAAA;YACnBC,cAAAA,EAAgB;AAClB,SAAA;QACAlC,IAAAA,EAAM,sBAAA;QACNqC,IAAAA,EAAM,CAAA;QACNpC,IAAAA,EAAM;AACR;AACD,CAAA;AAED,MAAMkB,kBAAAA,GAAqB,CAACnB,IAAAA,GAC1BA,IAAAA,KAAS,4BAA4BA,IAAAA,KAAS,2BAAA;;;;"}
|
|
@@ -3,6 +3,8 @@ import * as React from 'react';
|
|
|
3
3
|
import { useForm, InputRenderer } from '@strapi/admin/strapi-admin';
|
|
4
4
|
import { useCollator, Flex, Typography, Grid } from '@strapi/design-system';
|
|
5
5
|
import { useIntl } from 'react-intl';
|
|
6
|
+
import { COLLECTION_TYPES } from '../../../constants/collections.mjs';
|
|
7
|
+
import { isCustomOrderFeatureEnabled } from '../../../constants/customOrder.mjs';
|
|
6
8
|
import { useDoc } from '../../../hooks/useDocument.mjs';
|
|
7
9
|
import { getTranslation } from '../../../utils/translations.mjs';
|
|
8
10
|
|
|
@@ -20,8 +22,10 @@ const Settings = ()=>{
|
|
|
20
22
|
const formatter = useCollator(locale, {
|
|
21
23
|
sensitivity: 'base'
|
|
22
24
|
});
|
|
23
|
-
const { schema } = useDoc();
|
|
25
|
+
const { schema, collectionType } = useDoc();
|
|
24
26
|
const layout = useForm('Settings', (state)=>state.values.layout ?? []);
|
|
27
|
+
const hasCustomOrder = useForm('Settings', (state)=>state.values.settings.customOrder);
|
|
28
|
+
const canUseCustomOrder = collectionType === COLLECTION_TYPES && isCustomOrderFeatureEnabled();
|
|
25
29
|
const currentSortBy = useForm('Settings', (state)=>state.values.settings.defaultSortBy);
|
|
26
30
|
const onChange = useForm('Settings', (state)=>state.onChange);
|
|
27
31
|
const sortOptions = React.useMemo(()=>Object.values(layout).reduce((acc, field)=>{
|
|
@@ -47,10 +51,17 @@ const Settings = ()=>{
|
|
|
47
51
|
onChange,
|
|
48
52
|
sortOptionsSorted
|
|
49
53
|
]);
|
|
50
|
-
const formLayout = React.useMemo(()=>
|
|
54
|
+
const formLayout = React.useMemo(()=>[
|
|
55
|
+
...SETTINGS_FORM_LAYOUT,
|
|
56
|
+
...canUseCustomOrder ? [
|
|
57
|
+
CUSTOM_ORDER_FORM_LAYOUT
|
|
58
|
+
] : []
|
|
59
|
+
].map((row)=>row.map((field)=>{
|
|
51
60
|
if (field.type === 'enumeration') {
|
|
52
61
|
return {
|
|
53
62
|
...field,
|
|
63
|
+
// The custom order takes over the default sort of the list
|
|
64
|
+
disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),
|
|
54
65
|
hint: field.hint ? formatMessage(field.hint) : undefined,
|
|
55
66
|
label: formatMessage(field.label),
|
|
56
67
|
options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options
|
|
@@ -63,7 +74,9 @@ const Settings = ()=>{
|
|
|
63
74
|
};
|
|
64
75
|
}
|
|
65
76
|
})), [
|
|
77
|
+
canUseCustomOrder,
|
|
66
78
|
formatMessage,
|
|
79
|
+
hasCustomOrder,
|
|
67
80
|
sortOptionsSorted
|
|
68
81
|
]);
|
|
69
82
|
return /*#__PURE__*/ jsxs(Flex, {
|
|
@@ -175,6 +188,22 @@ const SETTINGS_FORM_LAYOUT = [
|
|
|
175
188
|
}
|
|
176
189
|
]
|
|
177
190
|
];
|
|
191
|
+
const CUSTOM_ORDER_FORM_LAYOUT = [
|
|
192
|
+
{
|
|
193
|
+
hint: {
|
|
194
|
+
id: getTranslation('form.Input.customOrder.hint'),
|
|
195
|
+
defaultMessage: 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.'
|
|
196
|
+
},
|
|
197
|
+
label: {
|
|
198
|
+
id: getTranslation('form.Input.customOrder'),
|
|
199
|
+
defaultMessage: 'Enable custom order'
|
|
200
|
+
},
|
|
201
|
+
name: 'settings.customOrder',
|
|
202
|
+
size: 6,
|
|
203
|
+
type: 'boolean'
|
|
204
|
+
}
|
|
205
|
+
];
|
|
206
|
+
const isDefaultSortField = (name)=>name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';
|
|
178
207
|
|
|
179
208
|
export { Settings };
|
|
180
209
|
//# sourceMappingURL=Settings.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Settings.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n SETTINGS_FORM_LAYOUT.map((row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as [top: EditFieldLayout[], bottom: EditFieldLayout[]],\n [formatMessage, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","useDoc","layout","useForm","state","values","currentSortBy","settings","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","map","row","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Settings.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES } from '../../../constants/collections';\nimport { isCustomOrderFeatureEnabled } from '../../../constants/customOrder';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema, collectionType } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const hasCustomOrder = useForm<FormData['settings']['customOrder']>(\n 'Settings',\n (state) => (state.values as FormData).settings.customOrder\n );\n const canUseCustomOrder = collectionType === COLLECTION_TYPES && isCustomOrderFeatureEnabled();\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n [...SETTINGS_FORM_LAYOUT, ...(canUseCustomOrder ? [CUSTOM_ORDER_FORM_LAYOUT] : [])].map(\n (row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n // The custom order takes over the default sort of the list\n disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options:\n field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as EditFieldLayout[][],\n [canUseCustomOrder, formatMessage, hasCustomOrder, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nconst CUSTOM_ORDER_FORM_LAYOUT: FormLayoutInputProps[] = [\n {\n hint: {\n id: getTranslation('form.Input.customOrder.hint'),\n defaultMessage:\n 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.',\n },\n label: {\n id: getTranslation('form.Input.customOrder'),\n defaultMessage: 'Enable custom order',\n },\n name: 'settings.customOrder',\n size: 6,\n type: 'boolean' as const,\n },\n];\n\nconst isDefaultSortField = (name: string) =>\n name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","collectionType","useDoc","layout","useForm","state","values","hasCustomOrder","settings","customOrder","canUseCustomOrder","COLLECTION_TYPES","isCustomOrderFeatureEnabled","currentSortBy","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","CUSTOM_ORDER_FORM_LAYOUT","map","row","disabled","isDefaultSortField","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":"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"}
|