@strapi/content-manager 5.57.0 → 5.59.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/ConfigurationForm/Fields.js +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
- package/dist/admin/components/ConfigurationForm/Fields.mjs +4 -3
- package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
- package/dist/admin/components/RelativeTime.js +2 -1
- package/dist/admin/components/RelativeTime.js.map +1 -1
- package/dist/admin/components/RelativeTime.mjs +2 -1
- package/dist/admin/components/RelativeTime.mjs.map +1 -1
- package/dist/admin/content-manager.js.map +1 -1
- package/dist/admin/content-manager.mjs.map +1 -1
- package/dist/admin/history/components/VersionContent.js +8 -8
- package/dist/admin/history/components/VersionContent.js.map +1 -1
- package/dist/admin/history/components/VersionContent.mjs +8 -8
- package/dist/admin/history/components/VersionContent.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentActions.js.map +1 -1
- package/dist/admin/hooks/useDocumentActions.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/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksEditor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +2 -2
- package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +7 -6
- package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentCategory.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/ComponentPicker.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +4 -3
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +31 -11
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +32 -12
- package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +2 -1
- package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.js +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormLayout.mjs +4 -4
- package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
- package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
- package/dist/admin/pages/EditView/utils/data.js +3 -3
- package/dist/admin/pages/EditView/utils/data.js.map +1 -1
- package/dist/admin/pages/EditView/utils/data.mjs +3 -3
- package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.js +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs +3 -3
- package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +2 -2
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.js +73 -13
- package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
- package/dist/admin/pages/ListView/ListViewPage.mjs +74 -14
- package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.js.map +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs +1 -1
- package/dist/admin/pages/ListView/components/AutoCloneFailureModal.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs +4 -1
- package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +12 -10
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +12 -10
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Relations.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.js.map +1 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs +2 -1
- package/dist/admin/pages/ListView/components/ViewSettingsMenu.mjs.map +1 -1
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js +68 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.js.map +1 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs +64 -0
- package/dist/admin/pages/ListView/utils/applyAttributeRenames.mjs.map +1 -0
- package/dist/admin/preview/components/PreviewHeader.js +3 -1
- package/dist/admin/preview/components/PreviewHeader.js.map +1 -1
- package/dist/admin/preview/components/PreviewHeader.mjs +3 -1
- package/dist/admin/preview/components/PreviewHeader.mjs.map +1 -1
- package/dist/admin/services/relations.js +5 -2
- package/dist/admin/services/relations.js.map +1 -1
- package/dist/admin/services/relations.mjs +5 -2
- package/dist/admin/services/relations.mjs.map +1 -1
- package/dist/admin/src/components/ConfigurationForm/Fields.d.ts +1 -1
- package/dist/admin/src/pages/ListView/utils/applyAttributeRenames.d.ts +12 -0
- package/dist/admin/translations/eu.json.js +3 -3
- package/dist/admin/translations/eu.json.mjs +3 -3
- package/dist/admin/translations/gu.json.js +4 -4
- package/dist/admin/translations/gu.json.mjs +4 -4
- package/dist/admin/translations/hi.json.js +9 -9
- package/dist/admin/translations/hi.json.mjs +9 -9
- package/dist/admin/translations/ml.json.js +6 -6
- package/dist/admin/translations/ml.json.mjs +6 -6
- package/dist/admin/translations/sa.json.js +10 -10
- package/dist/admin/translations/sa.json.mjs +10 -10
- package/dist/server/history/entitlements.js +26 -0
- package/dist/server/history/entitlements.js.map +1 -0
- package/dist/server/history/entitlements.mjs +24 -0
- package/dist/server/history/entitlements.mjs.map +1 -0
- package/dist/server/history/index.js +3 -0
- package/dist/server/history/index.js.map +1 -1
- package/dist/server/history/index.mjs +3 -0
- package/dist/server/history/index.mjs.map +1 -1
- package/dist/server/history/services/utils.js +19 -8
- package/dist/server/history/services/utils.js.map +1 -1
- package/dist/server/history/services/utils.mjs +18 -9
- package/dist/server/history/services/utils.mjs.map +1 -1
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/preview/services/preview-config.js.map +1 -1
- package/dist/server/preview/services/preview-config.mjs.map +1 -1
- package/dist/server/register.js +6 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +6 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/components.js.map +1 -1
- package/dist/server/services/components.mjs.map +1 -1
- package/dist/server/services/configuration/rename-fields.js +68 -0
- package/dist/server/services/configuration/rename-fields.js.map +1 -0
- package/dist/server/services/configuration/rename-fields.mjs +66 -0
- package/dist/server/services/configuration/rename-fields.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.js +164 -0
- package/dist/server/services/utils/configuration/attribute-renames.js.map +1 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs +161 -0
- package/dist/server/services/utils/configuration/attribute-renames.mjs.map +1 -0
- package/dist/server/services/utils/configuration/attributes.js +12 -12
- package/dist/server/services/utils/configuration/attributes.js.map +1 -1
- package/dist/server/services/utils/configuration/attributes.mjs +12 -12
- package/dist/server/services/utils/configuration/attributes.mjs.map +1 -1
- package/dist/server/src/history/entitlements.d.ts +9 -0
- package/dist/server/src/history/entitlements.d.ts.map +1 -0
- package/dist/server/src/history/index.d.ts.map +1 -1
- package/dist/server/src/history/services/utils.d.ts +6 -0
- package/dist/server/src/history/services/utils.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +2 -0
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/index.d.ts.map +1 -1
- package/dist/server/src/preview/services/preview-config.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/components.d.ts +2 -0
- package/dist/server/src/services/components.d.ts.map +1 -1
- package/dist/server/src/services/configuration/rename-fields.d.ts +15 -0
- package/dist/server/src/services/configuration/rename-fields.d.ts.map +1 -0
- package/dist/server/src/services/index.d.ts +2 -0
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts +57 -0
- package/dist/server/src/services/utils/configuration/attribute-renames.d.ts.map +1 -0
- 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/relations.d.ts +1 -0
- package/dist/shared/contracts/relations.d.ts.map +1 -1
- package/package.json +7 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortDisplayedFields.js","sources":["../../../../../admin/src/pages/ListConfiguration/components/SortDisplayedFields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden, Typography, Menu } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\n\nimport { DraggableCard, DraggableCardProps } from './DraggableCard';\n\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\nimport type { FormData } from '../ListConfigurationPage';\n\ninterface SortDisplayedFieldsProps extends Pick<ListLayout, 'metadatas'> {}\n\nconst SortDisplayedFields = ({ metadatas }: SortDisplayedFieldsProps) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const [isDraggingSibling, setIsDraggingSibling] = React.useState(false);\n const [lastAction, setLastAction] = React.useState<string | null>(null);\n const scrollableContainerRef = React.useRef<HTMLDivElement>(null);\n\n const values = useForm<FormData['layout']>(\n 'SortDisplayedFields',\n (state) => (state.values as FormData).layout ?? []\n );\n const addFieldRow = useForm('SortDisplayedFields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('SortDisplayedFields', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('SortDisplayedFields', (state) => state.moveFieldRow);\n\n /**\n * This is our list of fields that are not displayed in the current layout\n * so we create their default state to be added to the layout.\n */\n const nonDisplayedFields = React.useMemo(() => {\n if (!schema) {\n return [];\n }\n\n const displayedFieldNames = values.map((field) => field.name);\n\n return Object.entries(schema.attributes).reduce<Array<FormData['layout'][number]>>(\n (acc, [name, attribute]) => {\n if (!displayedFieldNames.includes(name) && checkIfAttributeIsDisplayable(attribute)) {\n const metadata = metadatas[name] || { label: name };\n\n acc.push({\n name,\n label: metadata.label || name,\n sortable: metadata.sortable,\n });\n }\n\n return acc;\n },\n []\n );\n }, [metadatas, values, schema]);\n\n const handleAddField = (field: FormData['layout'][number]) => {\n setLastAction('add');\n addFieldRow('layout', field);\n };\n\n const handleRemoveField = (index: number) => {\n setLastAction('remove');\n removeFieldRow('layout', index);\n };\n\n const handleMoveField: DraggableCardProps['onMoveField'] = (dragIndex, hoverIndex) => {\n moveFieldRow('layout', dragIndex, hoverIndex);\n };\n\n React.useEffect(() => {\n if (lastAction === 'add' && scrollableContainerRef?.current) {\n scrollableContainerRef.current.scrollLeft = scrollableContainerRef.current.scrollWidth;\n }\n }, [lastAction]);\n\n return (\n <Flex alignItems=\"stretch\" direction=\"column\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n\n <Flex padding={4} borderColor=\"neutral300\" borderStyle=\"dashed\" borderWidth=\"1px\" hasRadius>\n <Box flex=\"1\" overflow=\"auto hidden\" ref={scrollableContainerRef}>\n <Flex gap={3}>\n {values.map((field, index) => (\n <DraggableCard\n key={field.name}\n index={index}\n isDraggingSibling={isDraggingSibling}\n onMoveField={handleMoveField}\n onRemoveField={() => handleRemoveField(index)}\n setIsDraggingSibling={setIsDraggingSibling}\n {...field}\n attribute={schema!.attributes[field.name]}\n label={typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n />\n ))}\n </Flex>\n </Box>\n\n <Menu.Root>\n <Menu.Trigger\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"center\"\n endIcon={null}\n disabled={nonDisplayedFields.length === 0}\n variant=\"tertiary\"\n >\n <VisuallyHidden tag=\"span\">\n {formatMessage({\n id: getTranslation('components.FieldSelect.label'),\n defaultMessage: 'Add a field',\n })}\n </VisuallyHidden>\n <Plus aria-hidden focusable={false} style={{ position: 'relative', top: 2 }} />\n </Menu.Trigger>\n <Menu.Content>\n {nonDisplayedFields.map((field) => (\n <Menu.Item key={field.name} onSelect={() => handleAddField(field)}>\n {typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Flex>\n );\n};\n\nexport { SortDisplayedFields };\nexport type { SortDisplayedFieldsProps };\n"],"names":["SortDisplayedFields","metadatas","formatMessage","useIntl","schema","useDoc","isDraggingSibling","setIsDraggingSibling","React","useState","lastAction","setLastAction","scrollableContainerRef","useRef","values","useForm","state","layout","addFieldRow","removeFieldRow","moveFieldRow","nonDisplayedFields","useMemo","displayedFieldNames","map","field","name","Object","entries","attributes","reduce","acc","attribute","includes","checkIfAttributeIsDisplayable","metadata","label","push","sortable","handleAddField","handleRemoveField","index","handleMoveField","dragIndex","hoverIndex","useEffect","current","scrollLeft","scrollWidth","_jsxs","Flex","alignItems","direction","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","padding","borderColor","borderStyle","borderWidth","hasRadius","Box","flex","overflow","ref","DraggableCard","onMoveField","onRemoveField","Menu","Root","Trigger","paddingLeft","paddingRight","justifyContent","endIcon","disabled","length","VisuallyHidden","Plus","aria-hidden","focusable","style","position","top","Content","Item","onSelect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,MAAMA,mBAAAA,GAAsB,CAAC,EAAEC,SAAS,EAA4B,GAAA;IAClE,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,MAAM,EAAE,GAAGC,kBAAAA,EAAAA;AACnB,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACjE,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGH,gBAAAA,CAAMC,QAAQ,CAAgB,IAAA,CAAA;IAClE,MAAMG,sBAAAA,GAAyBJ,gBAAAA,CAAMK,MAAM,CAAiB,IAAA,CAAA;IAE5D,MAAMC,MAAAA,GAASC,mBAAAA,CACb,qBAAA,EACA,CAACC,KAAAA,GAAU,KAACA,CAAMF,MAAM,CAAcG,MAAM,IAAI,EAAE,CAAA;AAEpD,IAAA,MAAMC,cAAcH,mBAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAME,WAAW,CAAA;AAC/E,IAAA,MAAMC,iBAAiBJ,mBAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAMG,cAAc,CAAA;AACrF,IAAA,MAAMC,eAAeL,mBAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAMI,YAAY,CAAA;AAEjF;;;AAGC,MACD,MAAMC,kBAAAA,GAAqBb,gBAAAA,CAAMc,OAAO,CAAC,IAAA;AACvC,QAAA,IAAI,CAAClB,MAAAA,EAAQ;AACX,YAAA,OAAO,EAAE;AACX,QAAA;AAEA,QAAA,MAAMmB,sBAAsBT,MAAAA,CAAOU,GAAG,CAAC,CAACC,KAAAA,GAAUA,MAAMC,IAAI,CAAA;AAE5D,QAAA,OAAOC,MAAAA,CAAOC,OAAO,CAACxB,MAAAA,CAAOyB,UAAU,CAAA,CAAEC,MAAM,CAC7C,CAACC,GAAAA,EAAK,CAACL,IAAAA,EAAMM,SAAAA,CAAU,GAAA;AACrB,YAAA,IAAI,CAACT,mBAAAA,CAAoBU,QAAQ,CAACP,IAAAA,CAAAA,IAASQ,yCAA8BF,SAAAA,CAAAA,EAAY;AACnF,gBAAA,MAAMG,QAAAA,GAAWlC,SAAS,CAACyB,IAAAA,CAAK,IAAI;oBAAEU,KAAAA,EAAOV;AAAK,iBAAA;AAElDK,gBAAAA,GAAAA,CAAIM,IAAI,CAAC;AACPX,oBAAAA,IAAAA;oBACAU,KAAAA,EAAOD,QAAAA,CAASC,KAAK,IAAIV,IAAAA;AACzBY,oBAAAA,QAAAA,EAAUH,SAASG;AACrB,iBAAA,CAAA;AACF,YAAA;YAEA,OAAOP,GAAAA;AACT,QAAA,CAAA,EACA,EAAE,CAAA;IAEN,CAAA,EAAG;AAAC9B,QAAAA,SAAAA;AAAWa,QAAAA,MAAAA;AAAQV,QAAAA;AAAO,KAAA,CAAA;AAE9B,IAAA,MAAMmC,iBAAiB,CAACd,KAAAA,GAAAA;QACtBd,aAAAA,CAAc,KAAA,CAAA;AACdO,QAAAA,WAAAA,CAAY,QAAA,EAAUO,KAAAA,CAAAA;AACxB,IAAA,CAAA;AAEA,IAAA,MAAMe,oBAAoB,CAACC,KAAAA,GAAAA;QACzB9B,aAAAA,CAAc,QAAA,CAAA;AACdQ,QAAAA,cAAAA,CAAe,QAAA,EAAUsB,KAAAA,CAAAA;AAC3B,IAAA,CAAA;IAEA,MAAMC,eAAAA,GAAqD,CAACC,SAAAA,EAAWC,UAAAA,GAAAA;AACrExB,QAAAA,YAAAA,CAAa,UAAUuB,SAAAA,EAAWC,UAAAA,CAAAA;AACpC,IAAA,CAAA;AAEApC,IAAAA,gBAAAA,CAAMqC,SAAS,CAAC,IAAA;QACd,IAAInC,UAAAA,KAAe,KAAA,IAASE,sBAAAA,EAAwBkC,OAAAA,EAAS;AAC3DlC,YAAAA,sBAAAA,CAAuBkC,OAAO,CAACC,UAAU,GAAGnC,sBAAAA,CAAuBkC,OAAO,CAACE,WAAW;AACxF,QAAA;IACF,CAAA,EAAG;AAACtC,QAAAA;AAAW,KAAA,CAAA;AAEf,IAAA,qBACEuC,eAAA,CAACC,iBAAAA,EAAAA;QAAKC,UAAAA,EAAW,SAAA;QAAUC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;;0BACjDC,cAAA,CAACC,uBAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,GAAAA,EAAI,IAAA;0BAC7BvD,aAAAA,CAAc;AACbwD,oBAAAA,EAAAA,EAAIC,2BAAAA,CAAe,6BAAA,CAAA;oBACnBC,cAAAA,EAAgB;AAClB,iBAAA;;0BAGFX,eAAA,CAACC,iBAAAA,EAAAA;gBAAKW,OAAAA,EAAS,CAAA;gBAAGC,WAAAA,EAAY,YAAA;gBAAaC,WAAAA,EAAY,QAAA;gBAASC,WAAAA,EAAY,KAAA;gBAAMC,SAAS,EAAA,IAAA;;kCACzFX,cAAA,CAACY,gBAAAA,EAAAA;wBAAIC,IAAAA,EAAK,GAAA;wBAAIC,QAAAA,EAAS,aAAA;wBAAcC,GAAAA,EAAKzD,sBAAAA;AACxC,wBAAA,QAAA,gBAAA0C,cAAA,CAACJ,iBAAAA,EAAAA;4BAAKG,GAAAA,EAAK,CAAA;AACRvC,4BAAAA,QAAAA,EAAAA,MAAAA,CAAOU,GAAG,CAAC,CAACC,KAAAA,EAAOgB,sBAClBa,cAAA,CAACgB,2BAAAA,EAAAA;oCAEC7B,KAAAA,EAAOA,KAAAA;oCACPnC,iBAAAA,EAAmBA,iBAAAA;oCACnBiE,WAAAA,EAAa7B,eAAAA;AACb8B,oCAAAA,aAAAA,EAAe,IAAMhC,iBAAAA,CAAkBC,KAAAA,CAAAA;oCACvClC,oBAAAA,EAAsBA,oBAAAA;AACrB,oCAAA,GAAGkB,KAAK;AACTO,oCAAAA,SAAAA,EAAW5B,MAAAA,CAAQyB,UAAU,CAACJ,KAAAA,CAAMC,IAAI,CAAC;oCACzCU,KAAAA,EAAO,OAAOX,KAAAA,CAAMW,KAAK,KAAK,QAAA,GAAWlC,cAAcuB,KAAAA,CAAMW,KAAK,CAAA,GAAIX,KAAAA,CAAMW;AARvEX,iCAAAA,EAAAA,KAAAA,CAAMC,IAAI,CAAA;;;AAcvB,kCAAAuB,eAAA,CAACwB,kBAAKC,IAAI,EAAA;;AACR,0CAAAzB,eAAA,CAACwB,kBAAKE,OAAO,EAAA;gCACXC,WAAAA,EAAa,CAAA;gCACbC,YAAAA,EAAc,CAAA;gCACdC,cAAAA,EAAe,QAAA;gCACfC,OAAAA,EAAS,IAAA;gCACTC,QAAAA,EAAU3D,kBAAAA,CAAmB4D,MAAM,KAAK,CAAA;gCACxCzB,OAAAA,EAAQ,UAAA;;kDAERF,cAAA,CAAC4B,2BAAAA,EAAAA;wCAAezB,GAAAA,EAAI,MAAA;kDACjBvD,aAAAA,CAAc;AACbwD,4CAAAA,EAAAA,EAAIC,2BAAAA,CAAe,8BAAA,CAAA;4CACnBC,cAAAA,EAAgB;AAClB,yCAAA;;kDAEFN,cAAA,CAAC6B,UAAAA,EAAAA;wCAAKC,aAAW,EAAA,IAAA;wCAACC,SAAAA,EAAW,KAAA;wCAAOC,KAAAA,EAAO;4CAAEC,QAAAA,EAAU,UAAA;4CAAYC,GAAAA,EAAK;AAAE;;;;AAE5E,0CAAAlC,cAAA,CAACmB,kBAAKgB,OAAO,EAAA;AACVpE,gCAAAA,QAAAA,EAAAA,kBAAAA,CAAmBG,GAAG,CAAC,CAACC,KAAAA,iBACvB6B,cAAA,CAACmB,kBAAKiB,IAAI,EAAA;AAAkBC,wCAAAA,QAAAA,EAAU,IAAMpD,cAAAA,CAAed,KAAAA,CAAAA;kDACxD,OAAOA,KAAAA,CAAMW,KAAK,KAAK,QAAA,GAAWlC,cAAcuB,KAAAA,CAAMW,KAAK,CAAA,GAAIX,KAAAA,CAAMW;AADxDX,qCAAAA,EAAAA,KAAAA,CAAMC,IAAI,CAAA;;;;;;;;AASxC;;;;"}
|
|
1
|
+
{"version":3,"file":"SortDisplayedFields.js","sources":["../../../../../admin/src/pages/ListConfiguration/components/SortDisplayedFields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden, Typography, Menu } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\n\nimport { DraggableCard, DraggableCardProps } from './DraggableCard';\n\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\nimport type { FormData } from '../ListConfigurationPage';\n\ninterface SortDisplayedFieldsProps extends Pick<ListLayout, 'metadatas'> {}\n\nconst SortDisplayedFields = ({ metadatas }: SortDisplayedFieldsProps) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const [isDraggingSibling, setIsDraggingSibling] = React.useState(false);\n const [lastAction, setLastAction] = React.useState<string | null>(null);\n const scrollableContainerRef = React.useRef<HTMLDivElement>(null);\n\n const values = useForm<FormData['layout']>(\n 'SortDisplayedFields',\n (state) => (state.values as FormData).layout ?? []\n );\n const addFieldRow = useForm('SortDisplayedFields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('SortDisplayedFields', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('SortDisplayedFields', (state) => state.moveFieldRow);\n\n /**\n * This is our list of fields that are not displayed in the current layout\n * so we create their default state to be added to the layout.\n */\n const nonDisplayedFields = React.useMemo(() => {\n if (!schema) {\n return [];\n }\n\n const displayedFieldNames = new Set(values.map((field) => field.name));\n\n return Object.entries(schema.attributes).reduce<Array<FormData['layout'][number]>>(\n (acc, [name, attribute]) => {\n if (!displayedFieldNames.has(name) && checkIfAttributeIsDisplayable(attribute)) {\n const metadata = metadatas[name] || { label: name };\n\n acc.push({\n name,\n label: metadata.label || name,\n sortable: metadata.sortable,\n });\n }\n\n return acc;\n },\n []\n );\n }, [metadatas, values, schema]);\n\n const handleAddField = (field: FormData['layout'][number]) => {\n setLastAction('add');\n addFieldRow('layout', field);\n };\n\n const handleRemoveField = (index: number) => {\n setLastAction('remove');\n removeFieldRow('layout', index);\n };\n\n const handleMoveField: DraggableCardProps['onMoveField'] = (dragIndex, hoverIndex) => {\n moveFieldRow('layout', dragIndex, hoverIndex);\n };\n\n React.useEffect(() => {\n if (lastAction === 'add' && scrollableContainerRef?.current) {\n scrollableContainerRef.current.scrollLeft = scrollableContainerRef.current.scrollWidth;\n }\n }, [lastAction]);\n\n return (\n <Flex alignItems=\"stretch\" direction=\"column\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n\n <Flex padding={4} borderColor=\"neutral300\" borderStyle=\"dashed\" borderWidth=\"1px\" hasRadius>\n <Box flex=\"1\" overflow=\"auto hidden\" ref={scrollableContainerRef}>\n <Flex gap={3}>\n {values.map((field, index) => (\n <DraggableCard\n key={field.name}\n index={index}\n isDraggingSibling={isDraggingSibling}\n onMoveField={handleMoveField}\n onRemoveField={() => handleRemoveField(index)}\n setIsDraggingSibling={setIsDraggingSibling}\n {...field}\n attribute={schema!.attributes[field.name]}\n label={typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n />\n ))}\n </Flex>\n </Box>\n\n <Menu.Root>\n <Menu.Trigger\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"center\"\n endIcon={null}\n disabled={nonDisplayedFields.length === 0}\n variant=\"tertiary\"\n >\n <VisuallyHidden tag=\"span\">\n {formatMessage({\n id: getTranslation('components.FieldSelect.label'),\n defaultMessage: 'Add a field',\n })}\n </VisuallyHidden>\n <Plus aria-hidden focusable={false} style={{ position: 'relative', top: 2 }} />\n </Menu.Trigger>\n <Menu.Content>\n {nonDisplayedFields.map((field) => (\n <Menu.Item key={field.name} onSelect={() => handleAddField(field)}>\n {typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Flex>\n );\n};\n\nexport { SortDisplayedFields };\nexport type { SortDisplayedFieldsProps };\n"],"names":["SortDisplayedFields","metadatas","formatMessage","useIntl","schema","useDoc","isDraggingSibling","setIsDraggingSibling","React","useState","lastAction","setLastAction","scrollableContainerRef","useRef","values","useForm","state","layout","addFieldRow","removeFieldRow","moveFieldRow","nonDisplayedFields","useMemo","displayedFieldNames","Set","map","field","name","Object","entries","attributes","reduce","acc","attribute","has","checkIfAttributeIsDisplayable","metadata","label","push","sortable","handleAddField","handleRemoveField","index","handleMoveField","dragIndex","hoverIndex","useEffect","current","scrollLeft","scrollWidth","_jsxs","Flex","alignItems","direction","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","padding","borderColor","borderStyle","borderWidth","hasRadius","Box","flex","overflow","ref","DraggableCard","onMoveField","onRemoveField","Menu","Root","Trigger","paddingLeft","paddingRight","justifyContent","endIcon","disabled","length","VisuallyHidden","Plus","aria-hidden","focusable","style","position","top","Content","Item","onSelect"],"mappings":"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"}
|
|
@@ -26,9 +26,9 @@ const SortDisplayedFields = ({ metadatas })=>{
|
|
|
26
26
|
if (!schema) {
|
|
27
27
|
return [];
|
|
28
28
|
}
|
|
29
|
-
const displayedFieldNames = values.map((field)=>field.name);
|
|
29
|
+
const displayedFieldNames = new Set(values.map((field)=>field.name));
|
|
30
30
|
return Object.entries(schema.attributes).reduce((acc, [name, attribute])=>{
|
|
31
|
-
if (!displayedFieldNames.
|
|
31
|
+
if (!displayedFieldNames.has(name) && checkIfAttributeIsDisplayable(attribute)) {
|
|
32
32
|
const metadata = metadatas[name] || {
|
|
33
33
|
label: name
|
|
34
34
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SortDisplayedFields.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/SortDisplayedFields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden, Typography, Menu } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\n\nimport { DraggableCard, DraggableCardProps } from './DraggableCard';\n\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\nimport type { FormData } from '../ListConfigurationPage';\n\ninterface SortDisplayedFieldsProps extends Pick<ListLayout, 'metadatas'> {}\n\nconst SortDisplayedFields = ({ metadatas }: SortDisplayedFieldsProps) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const [isDraggingSibling, setIsDraggingSibling] = React.useState(false);\n const [lastAction, setLastAction] = React.useState<string | null>(null);\n const scrollableContainerRef = React.useRef<HTMLDivElement>(null);\n\n const values = useForm<FormData['layout']>(\n 'SortDisplayedFields',\n (state) => (state.values as FormData).layout ?? []\n );\n const addFieldRow = useForm('SortDisplayedFields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('SortDisplayedFields', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('SortDisplayedFields', (state) => state.moveFieldRow);\n\n /**\n * This is our list of fields that are not displayed in the current layout\n * so we create their default state to be added to the layout.\n */\n const nonDisplayedFields = React.useMemo(() => {\n if (!schema) {\n return [];\n }\n\n const displayedFieldNames = values.map((field) => field.name);\n\n return Object.entries(schema.attributes).reduce<Array<FormData['layout'][number]>>(\n (acc, [name, attribute]) => {\n if (!displayedFieldNames.includes(name) && checkIfAttributeIsDisplayable(attribute)) {\n const metadata = metadatas[name] || { label: name };\n\n acc.push({\n name,\n label: metadata.label || name,\n sortable: metadata.sortable,\n });\n }\n\n return acc;\n },\n []\n );\n }, [metadatas, values, schema]);\n\n const handleAddField = (field: FormData['layout'][number]) => {\n setLastAction('add');\n addFieldRow('layout', field);\n };\n\n const handleRemoveField = (index: number) => {\n setLastAction('remove');\n removeFieldRow('layout', index);\n };\n\n const handleMoveField: DraggableCardProps['onMoveField'] = (dragIndex, hoverIndex) => {\n moveFieldRow('layout', dragIndex, hoverIndex);\n };\n\n React.useEffect(() => {\n if (lastAction === 'add' && scrollableContainerRef?.current) {\n scrollableContainerRef.current.scrollLeft = scrollableContainerRef.current.scrollWidth;\n }\n }, [lastAction]);\n\n return (\n <Flex alignItems=\"stretch\" direction=\"column\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n\n <Flex padding={4} borderColor=\"neutral300\" borderStyle=\"dashed\" borderWidth=\"1px\" hasRadius>\n <Box flex=\"1\" overflow=\"auto hidden\" ref={scrollableContainerRef}>\n <Flex gap={3}>\n {values.map((field, index) => (\n <DraggableCard\n key={field.name}\n index={index}\n isDraggingSibling={isDraggingSibling}\n onMoveField={handleMoveField}\n onRemoveField={() => handleRemoveField(index)}\n setIsDraggingSibling={setIsDraggingSibling}\n {...field}\n attribute={schema!.attributes[field.name]}\n label={typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n />\n ))}\n </Flex>\n </Box>\n\n <Menu.Root>\n <Menu.Trigger\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"center\"\n endIcon={null}\n disabled={nonDisplayedFields.length === 0}\n variant=\"tertiary\"\n >\n <VisuallyHidden tag=\"span\">\n {formatMessage({\n id: getTranslation('components.FieldSelect.label'),\n defaultMessage: 'Add a field',\n })}\n </VisuallyHidden>\n <Plus aria-hidden focusable={false} style={{ position: 'relative', top: 2 }} />\n </Menu.Trigger>\n <Menu.Content>\n {nonDisplayedFields.map((field) => (\n <Menu.Item key={field.name} onSelect={() => handleAddField(field)}>\n {typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Flex>\n );\n};\n\nexport { SortDisplayedFields };\nexport type { SortDisplayedFieldsProps };\n"],"names":["SortDisplayedFields","metadatas","formatMessage","useIntl","schema","useDoc","isDraggingSibling","setIsDraggingSibling","React","useState","lastAction","setLastAction","scrollableContainerRef","useRef","values","useForm","state","layout","addFieldRow","removeFieldRow","moveFieldRow","nonDisplayedFields","useMemo","displayedFieldNames","map","field","name","Object","entries","attributes","reduce","acc","attribute","includes","checkIfAttributeIsDisplayable","metadata","label","push","sortable","handleAddField","handleRemoveField","index","handleMoveField","dragIndex","hoverIndex","useEffect","current","scrollLeft","scrollWidth","_jsxs","Flex","alignItems","direction","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","padding","borderColor","borderStyle","borderWidth","hasRadius","Box","flex","overflow","ref","DraggableCard","onMoveField","onRemoveField","Menu","Root","Trigger","paddingLeft","paddingRight","justifyContent","endIcon","disabled","length","VisuallyHidden","Plus","aria-hidden","focusable","style","position","top","Content","Item","onSelect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SortDisplayedFields.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/SortDisplayedFields.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm } from '@strapi/admin/strapi-admin';\nimport { Box, Flex, VisuallyHidden, Typography, Menu } from '@strapi/design-system';\nimport { Plus } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { checkIfAttributeIsDisplayable } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\n\nimport { DraggableCard, DraggableCardProps } from './DraggableCard';\n\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\nimport type { FormData } from '../ListConfigurationPage';\n\ninterface SortDisplayedFieldsProps extends Pick<ListLayout, 'metadatas'> {}\n\nconst SortDisplayedFields = ({ metadatas }: SortDisplayedFieldsProps) => {\n const { formatMessage } = useIntl();\n const { schema } = useDoc();\n const [isDraggingSibling, setIsDraggingSibling] = React.useState(false);\n const [lastAction, setLastAction] = React.useState<string | null>(null);\n const scrollableContainerRef = React.useRef<HTMLDivElement>(null);\n\n const values = useForm<FormData['layout']>(\n 'SortDisplayedFields',\n (state) => (state.values as FormData).layout ?? []\n );\n const addFieldRow = useForm('SortDisplayedFields', (state) => state.addFieldRow);\n const removeFieldRow = useForm('SortDisplayedFields', (state) => state.removeFieldRow);\n const moveFieldRow = useForm('SortDisplayedFields', (state) => state.moveFieldRow);\n\n /**\n * This is our list of fields that are not displayed in the current layout\n * so we create their default state to be added to the layout.\n */\n const nonDisplayedFields = React.useMemo(() => {\n if (!schema) {\n return [];\n }\n\n const displayedFieldNames = new Set(values.map((field) => field.name));\n\n return Object.entries(schema.attributes).reduce<Array<FormData['layout'][number]>>(\n (acc, [name, attribute]) => {\n if (!displayedFieldNames.has(name) && checkIfAttributeIsDisplayable(attribute)) {\n const metadata = metadatas[name] || { label: name };\n\n acc.push({\n name,\n label: metadata.label || name,\n sortable: metadata.sortable,\n });\n }\n\n return acc;\n },\n []\n );\n }, [metadatas, values, schema]);\n\n const handleAddField = (field: FormData['layout'][number]) => {\n setLastAction('add');\n addFieldRow('layout', field);\n };\n\n const handleRemoveField = (index: number) => {\n setLastAction('remove');\n removeFieldRow('layout', index);\n };\n\n const handleMoveField: DraggableCardProps['onMoveField'] = (dragIndex, hoverIndex) => {\n moveFieldRow('layout', dragIndex, hoverIndex);\n };\n\n React.useEffect(() => {\n if (lastAction === 'add' && scrollableContainerRef?.current) {\n scrollableContainerRef.current.scrollLeft = scrollableContainerRef.current.scrollWidth;\n }\n }, [lastAction]);\n\n return (\n <Flex alignItems=\"stretch\" direction=\"column\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.view'),\n defaultMessage: 'View',\n })}\n </Typography>\n\n <Flex padding={4} borderColor=\"neutral300\" borderStyle=\"dashed\" borderWidth=\"1px\" hasRadius>\n <Box flex=\"1\" overflow=\"auto hidden\" ref={scrollableContainerRef}>\n <Flex gap={3}>\n {values.map((field, index) => (\n <DraggableCard\n key={field.name}\n index={index}\n isDraggingSibling={isDraggingSibling}\n onMoveField={handleMoveField}\n onRemoveField={() => handleRemoveField(index)}\n setIsDraggingSibling={setIsDraggingSibling}\n {...field}\n attribute={schema!.attributes[field.name]}\n label={typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n />\n ))}\n </Flex>\n </Box>\n\n <Menu.Root>\n <Menu.Trigger\n paddingLeft={2}\n paddingRight={2}\n justifyContent=\"center\"\n endIcon={null}\n disabled={nonDisplayedFields.length === 0}\n variant=\"tertiary\"\n >\n <VisuallyHidden tag=\"span\">\n {formatMessage({\n id: getTranslation('components.FieldSelect.label'),\n defaultMessage: 'Add a field',\n })}\n </VisuallyHidden>\n <Plus aria-hidden focusable={false} style={{ position: 'relative', top: 2 }} />\n </Menu.Trigger>\n <Menu.Content>\n {nonDisplayedFields.map((field) => (\n <Menu.Item key={field.name} onSelect={() => handleAddField(field)}>\n {typeof field.label === 'object' ? formatMessage(field.label) : field.label}\n </Menu.Item>\n ))}\n </Menu.Content>\n </Menu.Root>\n </Flex>\n </Flex>\n );\n};\n\nexport { SortDisplayedFields };\nexport type { SortDisplayedFieldsProps };\n"],"names":["SortDisplayedFields","metadatas","formatMessage","useIntl","schema","useDoc","isDraggingSibling","setIsDraggingSibling","React","useState","lastAction","setLastAction","scrollableContainerRef","useRef","values","useForm","state","layout","addFieldRow","removeFieldRow","moveFieldRow","nonDisplayedFields","useMemo","displayedFieldNames","Set","map","field","name","Object","entries","attributes","reduce","acc","attribute","has","checkIfAttributeIsDisplayable","metadata","label","push","sortable","handleAddField","handleRemoveField","index","handleMoveField","dragIndex","hoverIndex","useEffect","current","scrollLeft","scrollWidth","_jsxs","Flex","alignItems","direction","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","padding","borderColor","borderStyle","borderWidth","hasRadius","Box","flex","overflow","ref","DraggableCard","onMoveField","onRemoveField","Menu","Root","Trigger","paddingLeft","paddingRight","justifyContent","endIcon","disabled","length","VisuallyHidden","Plus","aria-hidden","focusable","style","position","top","Content","Item","onSelect"],"mappings":"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"}
|
|
@@ -18,6 +18,7 @@ var useDocument = require('../../hooks/useDocument.js');
|
|
|
18
18
|
var useDocumentLayout = require('../../hooks/useDocumentLayout.js');
|
|
19
19
|
var usePersistentQueryParams = require('../../hooks/usePersistentQueryParams.js');
|
|
20
20
|
var usePrev = require('../../hooks/usePrev.js');
|
|
21
|
+
var contentTypes = require('../../services/contentTypes.js');
|
|
21
22
|
var documents = require('../../services/documents.js');
|
|
22
23
|
var api = require('../../utils/api.js');
|
|
23
24
|
var translations = require('../../utils/translations.js');
|
|
@@ -28,6 +29,7 @@ var Filters = require('./components/Filters.js');
|
|
|
28
29
|
var TableActions = require('./components/TableActions.js');
|
|
29
30
|
var CellContent = require('./components/TableCells/CellContent.js');
|
|
30
31
|
var ViewSettingsMenu = require('./components/ViewSettingsMenu.js');
|
|
32
|
+
var applyAttributeRenames = require('./utils/applyAttributeRenames.js');
|
|
31
33
|
|
|
32
34
|
function _interopNamespace(e) {
|
|
33
35
|
if (e && e.__esModule) return e;
|
|
@@ -50,6 +52,12 @@ function _interopNamespace(e) {
|
|
|
50
52
|
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
51
53
|
|
|
52
54
|
const { INJECT_COLUMN_IN_TABLE } = hooks.HOOKS;
|
|
55
|
+
const NON_LINKABLE_TYPES = new Set([
|
|
56
|
+
'media',
|
|
57
|
+
'relation',
|
|
58
|
+
'component',
|
|
59
|
+
'dynamiczone'
|
|
60
|
+
]);
|
|
53
61
|
/* -------------------------------------------------------------------------------------------------
|
|
54
62
|
* ListViewPage
|
|
55
63
|
* -----------------------------------------------------------------------------------------------*/ const LayoutsHeaderCustom = styledComponents.styled(strapiAdmin.Layouts.Header)`
|
|
@@ -102,6 +110,15 @@ const ListViewPage = ()=>{
|
|
|
102
110
|
model
|
|
103
111
|
]);
|
|
104
112
|
const { isHydrated } = usePersistentQueryParams.usePersistentPartialQueryParams(persistentQueryConfigs);
|
|
113
|
+
const { currentData: configuration } = contentTypes.useGetContentTypeConfigurationQuery(model);
|
|
114
|
+
const attributeRenames = React__namespace.useMemo(()=>configuration?.contentType?.attributeRenames ?? {}, [
|
|
115
|
+
configuration?.contentType?.attributeRenames
|
|
116
|
+
]);
|
|
117
|
+
/**
|
|
118
|
+
* The schema can be cached before this configuration response arrives. Dropping
|
|
119
|
+
* unknown column names in that window deletes a renamed field before its new
|
|
120
|
+
* name is known, and the browser cannot get it back.
|
|
121
|
+
*/ const configurationReady = configuration?.contentType?.uid === model;
|
|
105
122
|
const [displayedHeaderNames, setDisplayedHeaderNames] = strapiAdmin.useScopedPersistentState(`STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`, null);
|
|
106
123
|
const mapDisplayedHeaders = React__namespace.useCallback((headers)=>headers.map((header)=>header.name), []);
|
|
107
124
|
const displayedHeaders = React__namespace.useMemo(()=>{
|
|
@@ -144,14 +161,17 @@ const ListViewPage = ()=>{
|
|
|
144
161
|
list.layout
|
|
145
162
|
]);
|
|
146
163
|
React__namespace.useEffect(()=>{
|
|
147
|
-
if (!schema?.attributes) return;
|
|
164
|
+
if (!configurationReady || !schema?.attributes) return;
|
|
148
165
|
if (!displayedHeaderNames || displayedHeaderNames.length === 0) return;
|
|
149
166
|
if (schema.uid !== model) return;
|
|
150
|
-
const
|
|
151
|
-
|
|
152
|
-
|
|
167
|
+
const nextHeaders = applyAttributeRenames.applyAttributeRenamesToHeaders(displayedHeaderNames, schema.attributes, attributeRenames);
|
|
168
|
+
const headersChanged = nextHeaders.some((name, index)=>name !== displayedHeaderNames[index]);
|
|
169
|
+
if (headersChanged || nextHeaders.length !== displayedHeaderNames.length) {
|
|
170
|
+
handleSetHeaders(nextHeaders);
|
|
153
171
|
}
|
|
154
172
|
}, [
|
|
173
|
+
attributeRenames,
|
|
174
|
+
configurationReady,
|
|
155
175
|
displayedHeaderNames,
|
|
156
176
|
handleSetHeaders,
|
|
157
177
|
model,
|
|
@@ -163,8 +183,54 @@ const ListViewPage = ()=>{
|
|
|
163
183
|
pageSize: list.settings.pageSize.toString(),
|
|
164
184
|
sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ''
|
|
165
185
|
});
|
|
166
|
-
|
|
167
|
-
|
|
186
|
+
React__namespace.useEffect(()=>{
|
|
187
|
+
if (!configurationReady || !schema?.attributes || schema.uid !== model) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
const nextSort = typeof query.sort === 'string' ? applyAttributeRenames.applyAttributeRenamesToSort(query.sort, schema.attributes, attributeRenames) : query.sort;
|
|
191
|
+
const nextFilters = query.filters ? applyAttributeRenames.applyAttributeRenamesToFilters(query.filters, schema.attributes, attributeRenames) : query.filters;
|
|
192
|
+
const sortChanged = nextSort !== query.sort;
|
|
193
|
+
const filtersChanged = JSON.stringify(nextFilters) !== JSON.stringify(query.filters);
|
|
194
|
+
if (!sortChanged && !filtersChanged) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
setQuery(strapiAdmin.withEncodedUserParams(query, {
|
|
198
|
+
...sortChanged ? {
|
|
199
|
+
sort: nextSort
|
|
200
|
+
} : {},
|
|
201
|
+
...filtersChanged ? {
|
|
202
|
+
filters: strapiAdmin.deepEncodeQueryValues(nextFilters)
|
|
203
|
+
} : {}
|
|
204
|
+
}), 'push', true);
|
|
205
|
+
}, [
|
|
206
|
+
attributeRenames,
|
|
207
|
+
configurationReady,
|
|
208
|
+
model,
|
|
209
|
+
query,
|
|
210
|
+
schema?.attributes,
|
|
211
|
+
schema?.uid,
|
|
212
|
+
setQuery
|
|
213
|
+
]);
|
|
214
|
+
const params = React__namespace.useMemo(()=>{
|
|
215
|
+
if (!configurationReady || !schema?.attributes || schema.uid !== model) {
|
|
216
|
+
return api.buildValidParams(query);
|
|
217
|
+
}
|
|
218
|
+
return api.buildValidParams({
|
|
219
|
+
...query,
|
|
220
|
+
...typeof query.sort === 'string' ? {
|
|
221
|
+
sort: applyAttributeRenames.applyAttributeRenamesToSort(query.sort, schema.attributes, attributeRenames)
|
|
222
|
+
} : {},
|
|
223
|
+
...query.filters ? {
|
|
224
|
+
filters: applyAttributeRenames.applyAttributeRenamesToFilters(query.filters, schema.attributes, attributeRenames)
|
|
225
|
+
} : {}
|
|
226
|
+
});
|
|
227
|
+
}, [
|
|
228
|
+
attributeRenames,
|
|
229
|
+
configurationReady,
|
|
230
|
+
model,
|
|
231
|
+
query,
|
|
232
|
+
schema?.attributes,
|
|
233
|
+
schema?.uid
|
|
168
234
|
]);
|
|
169
235
|
const hasAppliedFilters = (query.filters?.$and?.length ?? 0) > 0;
|
|
170
236
|
const hasStatusFilter = Boolean(query.filters?.$and?.some((filter)=>filter.__status?.$eq !== undefined && filter.__status.$eq !== null));
|
|
@@ -302,13 +368,7 @@ const ListViewPage = ()=>{
|
|
|
302
368
|
* Only genuinely interactive cells are skipped: relations, media, components,
|
|
303
369
|
* dynamic zones (they embed their own links/menus), plugin-formatted columns
|
|
304
370
|
* (`cellFormatter`), and the synthetic `status` column.
|
|
305
|
-
*/ const
|
|
306
|
-
'media',
|
|
307
|
-
'relation',
|
|
308
|
-
'component',
|
|
309
|
-
'dynamiczone'
|
|
310
|
-
];
|
|
311
|
-
const linkCandidates = tableHeaders.filter(({ name, attribute, cellFormatter })=>name !== 'status' && typeof cellFormatter !== 'function' && attribute && !NON_LINKABLE_TYPES.includes(attribute.type));
|
|
371
|
+
*/ const linkCandidates = tableHeaders.filter(({ name, attribute, cellFormatter })=>name !== 'status' && typeof cellFormatter !== 'function' && attribute && !NON_LINKABLE_TYPES.has(attribute.type));
|
|
312
372
|
// The link column for a given row: the first candidate that actually has a
|
|
313
373
|
// value (uses CellContent's own hasContent so it matches the "-" the cell
|
|
314
374
|
// would otherwise render). documentId is checked directly (its own cell).
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListViewPage.js","sources":["../../../../admin/src/pages/ListView/ListViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n SearchInput,\n Table,\n BackButton,\n useNotification,\n useStrapiApp,\n useTracking,\n useAPIErrorHandler,\n useQueryParams,\n useScopedPersistentState,\n useRBAC,\n Layouts,\n useTable,\n useIsMobile,\n useClipboard,\n tours,\n withEncodedUserParams,\n} from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Flex,\n Typography,\n ButtonProps,\n Box,\n EmptyStateLayout,\n IconButton,\n} from '@strapi/design-system';\nimport { Duplicate, Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, Link as ReactRouterLink, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { HOOKS } from '../../constants/hooks';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n ListFieldLayout,\n convertListLayoutToFieldLayouts,\n useDocumentLayout,\n} from '../../hooks/useDocumentLayout';\nimport {\n type PersistentQueryConfig,\n usePersistentPartialQueryParams,\n} from '../../hooks/usePersistentQueryParams';\nimport { usePrev } from '../../hooks/usePrev';\nimport { useGetAllDocumentsQuery } from '../../services/documents';\nimport { buildValidParams } from '../../utils/api';\nimport { getTranslation } from '../../utils/translations';\nimport { getDisplayName } from '../../utils/users';\nimport { DocumentStatus } from '../EditView/components/DocumentStatus';\n\nimport { BulkActionsRenderer } from './components/BulkActions/Actions';\nimport { listViewFilters as Filters } from './components/Filters';\nimport { TableActions } from './components/TableActions';\nimport { CellContent, hasContent } from './components/TableCells/CellContent';\nimport { ViewSettingsMenu } from './components/ViewSettingsMenu';\n\nimport type { Modules } from '@strapi/types';\n\nconst { INJECT_COLUMN_IN_TABLE } = HOOKS;\n\n/* -------------------------------------------------------------------------------------------------\n * ListViewPage\n * -----------------------------------------------------------------------------------------------*/\nconst LayoutsHeaderCustom = styled(Layouts.Header)`\n overflow-wrap: anywhere;\n`;\n\ntype ListViewQuery = {\n filters?: {\n $and?: Array<{\n __status?: {\n $eq?: unknown;\n };\n }>;\n };\n plugins?: Record<string, unknown>;\n page?: string;\n pageSize?: string;\n sort?: string;\n _q?: string;\n};\n\nconst ListViewPage = () => {\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const isMobile = useIsMobile();\n\n const handleCopyDocumentId = React.useCallback(\n async (e: React.MouseEvent, documentId: string | undefined) => {\n e.stopPropagation();\n if (!documentId) return;\n const didCopy = await copy(documentId);\n if (didCopy) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-manager.actions.copy-documentId.success',\n defaultMessage: 'Document ID copied to clipboard',\n }),\n });\n }\n },\n [copy, formatMessage, toggleNotification]\n );\n\n const { collectionType, model, schema } = useDoc();\n const { list, listViewConversionContext, isLoading: isLoadingLayout } = useDocumentLayout(model);\n\n const persistentQueryConfigs: PersistentQueryConfig = React.useMemo(\n () => ({\n [`STRAPI_LIST_VIEW_SETTINGS:${model}`]: {\n paths: ['sort', 'filters', 'pageSize'],\n scoped: true,\n },\n STRAPI_LOCALE: {\n paths: ['plugins.i18n.locale'],\n scoped: false,\n },\n }),\n [model]\n );\n const { isHydrated } = usePersistentPartialQueryParams(persistentQueryConfigs);\n\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const mapDisplayedHeaders = React.useCallback(\n (headers: ListFieldLayout[]) => headers.map((header) => header.name),\n []\n );\n\n const displayedHeaders: ListFieldLayout[] = React.useMemo(() => {\n if (\n !displayedHeaderNames ||\n !list.metadatas ||\n Object.keys(list.metadatas).length <= 0 ||\n !schema?.attributes ||\n !listViewConversionContext\n )\n return [];\n\n return convertListLayoutToFieldLayouts(\n displayedHeaderNames,\n schema.attributes,\n list.metadatas,\n {\n configurations: listViewConversionContext.componentConfigurations,\n schemas: listViewConversionContext.componentSchemas,\n },\n listViewConversionContext.contentTypeSchemas\n );\n }, [displayedHeaderNames, schema, list, listViewConversionContext]);\n\n const handleSetHeaders = React.useCallback(\n (headers: string[]) => {\n setDisplayedHeaderNames(headers);\n },\n [setDisplayedHeaderNames]\n );\n\n const handleResetHeaders = React.useCallback(() => {\n setDisplayedHeaderNames(mapDisplayedHeaders(list.layout));\n }, [list.layout, mapDisplayedHeaders, setDisplayedHeaderNames]);\n\n /**\n * If the persistent displayedHeaders are not yet initialized, set them to list.layout\n */\n React.useEffect(() => {\n // wait for list.layout to be loaded\n if (list.layout.length === 0) {\n return;\n }\n\n if (!displayedHeaderNames) {\n handleResetHeaders();\n }\n }, [displayedHeaderNames, handleResetHeaders, list.layout]);\n\n React.useEffect(() => {\n if (!schema?.attributes) return;\n if (!displayedHeaderNames || displayedHeaderNames.length === 0) return;\n if (schema.uid !== model) return;\n\n const allowedDisplayHeaders = displayedHeaderNames.filter((header) =>\n Object.keys(schema?.attributes).includes(header)\n );\n\n if (allowedDisplayHeaders.length !== displayedHeaderNames.length) {\n handleSetHeaders(allowedDisplayHeaders);\n }\n }, [displayedHeaderNames, handleSetHeaders, model, schema?.attributes, schema?.uid]);\n\n const [{ query }, setQuery] = useQueryParams<ListViewQuery>({\n page: '1',\n pageSize: list.settings.pageSize.toString(),\n sort: list.settings.defaultSortBy\n ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}`\n : '',\n });\n\n const params = React.useMemo(() => buildValidParams(query), [query]);\n const hasAppliedFilters = (query.filters?.$and?.length ?? 0) > 0;\n const hasStatusFilter = Boolean(\n query.filters?.$and?.some(\n (filter) => filter.__status?.$eq !== undefined && filter.__status.$eq !== null\n )\n );\n\n // If a __status filter becomes active while sort=status:* is in the URL, strip the status sort.\n React.useEffect(() => {\n if (\n hasStatusFilter &&\n typeof query.sort === 'string' &&\n /(?:^|,)\\s*status:/i.test(query.sort)\n ) {\n const cleaned = query.sort\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !/^status:(ASC|DESC)$/i.test(s))\n .join(',');\n setQuery(withEncodedUserParams(query, { sort: cleaned || undefined }), 'push', true);\n }\n }, [hasStatusFilter, query, setQuery]);\n\n const { data, error, isLoading, isFetching } = useGetAllDocumentsQuery(\n {\n model,\n params,\n },\n { skip: isLoadingLayout || !isHydrated }\n );\n\n /**\n * If the API returns an error, display a notification\n */\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const { results = [], pagination } = data ?? {};\n\n React.useEffect(() => {\n if (pagination && pagination.pageCount > 0 && pagination.page > pagination.pageCount) {\n navigate(\n {\n search: stringify({\n ...query,\n page: pagination.pageCount,\n }),\n },\n { replace: true }\n );\n }\n }, [pagination, formatMessage, query, navigate]);\n\n const { canCreate, isLoadingActionsRBAC } = useDocumentRBAC(\n 'ListViewPage',\n ({ canCreate, isLoading }) => ({\n canCreate,\n isLoadingActionsRBAC: isLoading,\n })\n );\n\n const runHookWaterfall = useStrapiApp('ListViewPage', ({ runHookWaterfall }) => runHookWaterfall);\n /**\n * Run the waterfall and then inject our additional table headers.\n */\n const tableHeaders = React.useMemo(() => {\n const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {\n displayedHeaders,\n layout: list,\n });\n\n const formattedHeaders = headers.displayedHeaders.map<ListFieldLayout>((header) => {\n /**\n * When the header label is a string, it is an attribute on the current content-type:\n * Use the attribute name value to compute the translation.\n * Otherwise, it should be a translation object coming from a plugin that injects into the table (ie i18n, content-releases, review-workflows):\n * Use the translation object as is.\n */\n const translation =\n typeof header.label === 'string'\n ? {\n id: `content-manager.content-types.${model}.${header.name}`,\n defaultMessage: header.label,\n }\n : header.label;\n\n return {\n ...header,\n label: formatMessage(translation),\n name: `${header.name}${header.mainField?.name ? `.${header.mainField.name}` : ''}`,\n };\n });\n\n if (schema?.options?.draftAndPublish) {\n formattedHeaders.push({\n attribute: {\n type: 'custom',\n },\n name: 'status',\n label: formatMessage({\n id: getTranslation(`containers.list.table-headers.status`),\n defaultMessage: 'status',\n }),\n searchable: false,\n sortable: !hasStatusFilter,\n } satisfies ListFieldLayout);\n }\n\n return formattedHeaders;\n }, [\n displayedHeaders,\n formatMessage,\n hasStatusFilter,\n list,\n runHookWaterfall,\n schema?.options?.draftAndPublish,\n model,\n ]);\n\n if (isLoadingLayout || !isHydrated || isLoading || isLoadingActionsRBAC) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n const contentTypeTitle = schema?.info.displayName\n ? formatMessage({ id: schema.info.displayName, defaultMessage: schema.info.displayName })\n : formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n\n const handleRowClick = (id: Modules.Documents.ID) => () => {\n trackUsage('willEditEntryFromList');\n navigate({\n pathname: id.toString(),\n search: stringify({ plugins: query.plugins }),\n });\n };\n\n /**\n * The entry link is rendered on the first non-interactive column *that has a\n * value for the row* (resolved per row, so an empty cell — rendered as \"-\" —\n * is skipped and the next candidate carries the link instead). Any scalar\n * column qualifies — text, numbers, dates (createdAt/updatedAt), `id`, and\n * `documentId` (its id text becomes the link, the copy button stays separate).\n * Only genuinely interactive cells are skipped: relations, media, components,\n * dynamic zones (they embed their own links/menus), plugin-formatted columns\n * (`cellFormatter`), and the synthetic `status` column.\n */\n const NON_LINKABLE_TYPES = ['media', 'relation', 'component', 'dynamiczone'];\n const linkCandidates = tableHeaders.filter(\n ({ name, attribute, cellFormatter }) =>\n name !== 'status' &&\n typeof cellFormatter !== 'function' &&\n attribute &&\n !NON_LINKABLE_TYPES.includes(attribute.type)\n );\n\n // The link column for a given row: the first candidate that actually has a\n // value (uses CellContent's own hasContent so it matches the \"-\" the cell\n // would otherwise render). documentId is checked directly (its own cell).\n const getRowLinkField = (row: (typeof results)[number]) =>\n linkCandidates.find((header) => {\n if (header.name === 'documentId') {\n return Boolean(row.documentId);\n }\n const value = row[header.name.split('.')[0]];\n return hasContent(value, header.mainField, header.attribute);\n })?.name;\n\n const isEmptyState = !isFetching && results.length === 0;\n\n const endActions = (\n <>\n {isMobile && list.settings.filterable && schema && <Filters.Trigger />}\n <InjectionZone area=\"listView.actions\" />\n <ViewSettingsMenu\n setHeaders={handleSetHeaders}\n resetHeaders={handleResetHeaders}\n headers={displayedHeaderNames ?? []}\n />\n </>\n );\n\n const searchInput = (\n <>\n {list.settings.searchable && (\n <SearchInput\n label={formatMessage(\n { id: 'app.component.search.label', defaultMessage: 'Search for {target}' },\n { target: contentTypeTitle }\n )}\n placeholder={formatMessage({\n id: 'global.search',\n defaultMessage: 'Search',\n })}\n trackedEvent=\"didSearch\"\n />\n )}\n </>\n );\n\n const startActions = (\n <>\n {searchInput}\n {!isMobile && list.settings.filterable && schema && (\n <>\n <Filters.Trigger />\n <Filters.List />\n </>\n )}\n </>\n );\n\n const actions =\n list.settings.filterable && schema ? (\n <Filters.Root schema={schema} layout={list}>\n <Layouts.Action\n endActions={endActions}\n startActions={startActions}\n bottomActions={isMobile && hasAppliedFilters ? <Filters.List /> : null}\n />\n <Filters.Popover />\n </Filters.Root>\n ) : (\n <Layouts.Action endActions={endActions} startActions={startActions} />\n );\n\n return (\n <>\n <tours.contentManager.Introduction>\n {/* Invisible Anchor */}\n <Box />\n </tours.contentManager.Introduction>\n <Page.Main>\n <Page.Title>{`${contentTypeTitle}`}</Page.Title>\n <LayoutsHeaderCustom\n primaryAction={\n canCreate ? (\n <tours.contentManager.CreateNewEntry>\n <CreateButton />\n </tours.contentManager.CreateNewEntry>\n ) : null\n }\n subtitle={formatMessage(\n {\n id: getTranslation('pages.ListView.header-subtitle'),\n defaultMessage:\n '{number, plural, =0 {# entries} one {# entry} other {# entries}} found',\n },\n { number: pagination?.total }\n )}\n title={contentTypeTitle}\n navigationAction={<BackButton />}\n />\n {actions}\n <Layouts.Content>\n {isEmptyState ? (\n <Box background=\"neutral0\" shadow=\"filterShadow\" hasRadius>\n <EmptyStateLayout\n action={\n canCreate && (\n <Box>\n <CreateButton variant=\"secondary\" />\n </Box>\n )\n }\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n </Box>\n ) : (\n <Flex gap={4} direction=\"column\" alignItems=\"stretch\">\n <Table.Root rows={results} headers={tableHeaders} isLoading={isFetching}>\n <TableActionsBar />\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {tableHeaders.map((header: ListFieldLayout) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Loading />\n <Table.Empty action={canCreate ? <CreateButton variant=\"secondary\" /> : null} />\n <Table.Body>\n {results.map((row) => {\n const rowLinkField = getRowLinkField(row);\n return (\n <Table.Row\n cursor=\"pointer\"\n key={row.id}\n onClick={handleRowClick(row.documentId)}\n >\n <Table.CheckboxCell id={row.id} />\n {tableHeaders.map(({ cellFormatter, ...header }) => {\n if (header.name === 'status') {\n const { status } = row;\n\n return (\n <Table.Cell key={header.name}>\n <DocumentStatus status={status} maxWidth={'min-content'} />\n </Table.Cell>\n );\n }\n if (['createdBy', 'updatedBy'].includes(header.name.split('.')[0])) {\n // Display the users full name\n // Some entries doesn't have a user assigned as creator/updater (ex: entries created through content API)\n // In this case, we display a dash\n return (\n <Table.Cell key={header.name}>\n <Typography textColor=\"neutral800\">\n {row[header.name.split('.')[0]]\n ? getDisplayName(row[header.name.split('.')[0]])\n : '-'}\n </Typography>\n </Table.Cell>\n );\n }\n if (header.name === 'documentId') {\n // When documentId is the primary link column, only its\n // id text becomes the link; the copy button stays outside.\n const isDocumentIdLink =\n header.name === rowLinkField && Boolean(row.documentId);\n return (\n <Table.Cell key={header.name}>\n <Flex gap={2} alignItems=\"center\" width=\"100%\" minWidth={0}>\n {isDocumentIdLink ? (\n <Typography\n tag={ReactRouterLink}\n to={{\n pathname: row.documentId,\n search: stringify({ plugins: query.plugins }),\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n textColor=\"neutral800\"\n maxWidth=\"30rem\"\n ellipsis\n >\n {row.documentId}\n </Typography>\n ) : (\n <Typography textColor=\"neutral800\" maxWidth=\"30rem\" ellipsis>\n {row.documentId || '-'}\n </Typography>\n )}\n {row.documentId && (\n <IconButton\n variant=\"ghost\"\n size=\"S\"\n label={formatMessage({\n id: 'content-manager.actions.copy-documentId.label',\n defaultMessage: 'Copy',\n })}\n onClick={(e) => handleCopyDocumentId(e, row.documentId)}\n >\n <Duplicate />\n </IconButton>\n )}\n </Flex>\n </Table.Cell>\n );\n }\n if (typeof cellFormatter === 'function') {\n return (\n <Table.Cell key={header.name}>\n {/* @ts-expect-error – TODO: fix this TS error */}\n {cellFormatter(row, header, { collectionType, model })}\n </Table.Cell>\n );\n }\n return (\n <Table.Cell key={header.name}>\n <CellContent\n content={row[header.name.split('.')[0]]}\n rowId={row.documentId}\n {...header}\n linkTo={\n header.name === rowLinkField\n ? {\n pathname: row.documentId,\n search: stringify({ plugins: query.plugins }),\n }\n : undefined\n }\n />\n </Table.Cell>\n );\n })}\n {/* we stop propagation here to allow the menu to trigger it's events without triggering the row redirect */}\n <ActionsCell onClick={(e) => e.stopPropagation()}>\n <TableActions document={row} />\n </ActionsCell>\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n <Pagination.Root\n {...pagination}\n defaultPageSize={list.settings.pageSize}\n onPageSizeChange={() => trackUsage('willChangeNumberOfEntriesPerPage')}\n >\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Flex>\n )}\n </Layouts.Content>\n </Page.Main>\n </>\n );\n};\n\nconst ActionsCell = styled(Table.Cell)`\n display: flex;\n justify-content: flex-end;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionsBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst TableActionsBar = () => {\n const selectRow = useTable('TableActionsBar', (state) => state.selectRow);\n const [{ query }] = useQueryParams<{ plugins: { i18n: { locale: string } } }>();\n const locale = query?.plugins?.i18n?.locale;\n const prevLocale = usePrev(locale);\n\n // TODO: find a better way to reset the selected rows when the locale changes across all the app\n React.useEffect(() => {\n if (prevLocale !== locale) {\n selectRow([]);\n }\n }, [selectRow, prevLocale, locale]);\n\n return (\n <Table.ActionBar>\n <BulkActionsRenderer />\n </Table.ActionBar>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CreateButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CreateButtonProps extends Pick<ButtonProps, 'variant'> {}\n\nconst CreateButton = ({ variant }: CreateButtonProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }] = useQueryParams<{ plugins: object }>();\n\n return (\n <Button\n variant={variant}\n tag={ReactRouterLink}\n onClick={() => {\n trackUsage('willCreateEntry', { status: 'draft' });\n }}\n startIcon={<Plus />}\n style={{ textDecoration: 'none' }}\n to={{\n pathname: 'create',\n search: stringify({ plugins: query.plugins }),\n }}\n minWidth=\"max-content\"\n fullWidth\n >\n {formatMessage({\n id: getTranslation('HeaderLayout.button.label-add-entry'),\n defaultMessage: 'Create new entry',\n })}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedListViewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedListViewPage = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: slug,\n }))\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return <Page.Error />;\n }\n\n return (\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <ListViewPage key={slug} />\n </DocumentRBAC>\n )}\n </Page.Protect>\n );\n};\n\nexport { ListViewPage, ProtectedListViewPage };\n"],"names":["INJECT_COLUMN_IN_TABLE","HOOKS","LayoutsHeaderCustom","styled","Layouts","Header","ListViewPage","trackUsage","useTracking","navigate","useNavigate","formatMessage","useIntl","toggleNotification","useNotification","copy","useClipboard","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","isMobile","useIsMobile","handleCopyDocumentId","React","useCallback","e","documentId","stopPropagation","didCopy","type","message","id","defaultMessage","collectionType","model","schema","useDoc","list","listViewConversionContext","isLoading","isLoadingLayout","useDocumentLayout","persistentQueryConfigs","useMemo","paths","scoped","STRAPI_LOCALE","isHydrated","usePersistentPartialQueryParams","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","mapDisplayedHeaders","headers","map","header","name","displayedHeaders","metadatas","Object","keys","length","attributes","convertListLayoutToFieldLayouts","configurations","componentConfigurations","schemas","componentSchemas","contentTypeSchemas","handleSetHeaders","handleResetHeaders","layout","useEffect","uid","allowedDisplayHeaders","filter","includes","query","setQuery","useQueryParams","page","pageSize","settings","toString","sort","defaultSortBy","defaultSortOrder","params","buildValidParams","hasAppliedFilters","filters","$and","hasStatusFilter","Boolean","some","__status","$eq","undefined","test","cleaned","split","s","trim","join","withEncodedUserParams","data","error","isFetching","useGetAllDocumentsQuery","skip","results","pagination","pageCount","search","stringify","replace","canCreate","isLoadingActionsRBAC","useDocumentRBAC","runHookWaterfall","useStrapiApp","tableHeaders","formattedHeaders","translation","label","mainField","options","draftAndPublish","push","attribute","searchable","sortable","_jsx","Page","Loading","Error","contentTypeTitle","info","displayName","handleRowClick","pathname","plugins","NON_LINKABLE_TYPES","linkCandidates","cellFormatter","getRowLinkField","row","find","value","hasContent","isEmptyState","endActions","_jsxs","_Fragment","filterable","Filters","Trigger","InjectionZone","area","ViewSettingsMenu","setHeaders","resetHeaders","searchInput","SearchInput","target","placeholder","trackedEvent","startActions","List","actions","Root","Action","bottomActions","Popover","tours","contentManager","Introduction","Box","Main","Title","primaryAction","CreateNewEntry","CreateButton","subtitle","number","total","title","navigationAction","BackButton","Content","background","shadow","hasRadius","EmptyStateLayout","action","variant","content","icon","EmptyDocuments","width","Flex","gap","direction","alignItems","Table","rows","TableActionsBar","Head","HeaderCheckboxCell","HeaderCell","Empty","Body","rowLinkField","Row","cursor","onClick","CheckboxCell","status","Cell","DocumentStatus","maxWidth","Typography","textColor","getDisplayName","isDocumentIdLink","minWidth","tag","ReactRouterLink","to","ellipsis","IconButton","size","Duplicate","CellContent","rowId","linkTo","ActionsCell","TableActions","document","Pagination","defaultPageSize","onPageSizeChange","PageSize","Links","selectRow","useTable","state","locale","i18n","prevLocale","usePrev","ActionBar","BulkActionsRenderer","Button","startIcon","Plus","style","textDecoration","fullWidth","ProtectedListViewPage","slug","useParams","permissions","useRBAC","PERMISSIONS","subject","Protect","DocumentRBAC"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ListViewPage.js","sources":["../../../../admin/src/pages/ListView/ListViewPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Page,\n Pagination,\n SearchInput,\n Table,\n BackButton,\n useNotification,\n useStrapiApp,\n useTracking,\n useAPIErrorHandler,\n useQueryParams,\n useScopedPersistentState,\n useRBAC,\n Layouts,\n useTable,\n useIsMobile,\n useClipboard,\n tours,\n deepEncodeQueryValues,\n withEncodedUserParams,\n} from '@strapi/admin/strapi-admin';\nimport {\n Button,\n Flex,\n Typography,\n ButtonProps,\n Box,\n EmptyStateLayout,\n IconButton,\n} from '@strapi/design-system';\nimport { Duplicate, Plus } from '@strapi/icons';\nimport { EmptyDocuments } from '@strapi/icons/symbols';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, Link as ReactRouterLink, useParams } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { InjectionZone } from '../../components/InjectionZone';\nimport { HOOKS } from '../../constants/hooks';\nimport { PERMISSIONS } from '../../constants/plugin';\nimport { DocumentRBAC, useDocumentRBAC } from '../../features/DocumentRBAC';\nimport { useDoc } from '../../hooks/useDocument';\nimport {\n ListFieldLayout,\n convertListLayoutToFieldLayouts,\n useDocumentLayout,\n} from '../../hooks/useDocumentLayout';\nimport {\n type PersistentQueryConfig,\n usePersistentPartialQueryParams,\n} from '../../hooks/usePersistentQueryParams';\nimport { usePrev } from '../../hooks/usePrev';\nimport { useGetContentTypeConfigurationQuery } from '../../services/contentTypes';\nimport { useGetAllDocumentsQuery } from '../../services/documents';\nimport { buildValidParams } from '../../utils/api';\nimport { getTranslation } from '../../utils/translations';\nimport { getDisplayName } from '../../utils/users';\nimport { DocumentStatus } from '../EditView/components/DocumentStatus';\n\nimport { BulkActionsRenderer } from './components/BulkActions/Actions';\nimport { listViewFilters as Filters } from './components/Filters';\nimport { TableActions } from './components/TableActions';\nimport { CellContent, hasContent } from './components/TableCells/CellContent';\nimport { ViewSettingsMenu } from './components/ViewSettingsMenu';\nimport {\n applyAttributeRenamesToFilters,\n applyAttributeRenamesToHeaders,\n applyAttributeRenamesToSort,\n} from './utils/applyAttributeRenames';\n\nimport type { Modules } from '@strapi/types';\n\nconst { INJECT_COLUMN_IN_TABLE } = HOOKS;\nconst NON_LINKABLE_TYPES = new Set(['media', 'relation', 'component', 'dynamiczone']);\n\n/* -------------------------------------------------------------------------------------------------\n * ListViewPage\n * -----------------------------------------------------------------------------------------------*/\nconst LayoutsHeaderCustom = styled(Layouts.Header)`\n overflow-wrap: anywhere;\n`;\n\ntype ListViewQuery = {\n filters?: {\n $and?: Array<{\n __status?: {\n $eq?: unknown;\n };\n }>;\n };\n plugins?: Record<string, unknown>;\n page?: string;\n pageSize?: string;\n sort?: string;\n _q?: string;\n};\n\nconst ListViewPage = () => {\n const { trackUsage } = useTracking();\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { copy } = useClipboard();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler(getTranslation);\n const isMobile = useIsMobile();\n\n const handleCopyDocumentId = React.useCallback(\n async (e: React.MouseEvent, documentId: string | undefined) => {\n e.stopPropagation();\n if (!documentId) return;\n const didCopy = await copy(documentId);\n if (didCopy) {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'content-manager.actions.copy-documentId.success',\n defaultMessage: 'Document ID copied to clipboard',\n }),\n });\n }\n },\n [copy, formatMessage, toggleNotification]\n );\n\n const { collectionType, model, schema } = useDoc();\n const { list, listViewConversionContext, isLoading: isLoadingLayout } = useDocumentLayout(model);\n\n const persistentQueryConfigs: PersistentQueryConfig = React.useMemo(\n () => ({\n [`STRAPI_LIST_VIEW_SETTINGS:${model}`]: {\n paths: ['sort', 'filters', 'pageSize'],\n scoped: true,\n },\n STRAPI_LOCALE: {\n paths: ['plugins.i18n.locale'],\n scoped: false,\n },\n }),\n [model]\n );\n const { isHydrated } = usePersistentPartialQueryParams(persistentQueryConfigs);\n\n const { currentData: configuration } = useGetContentTypeConfigurationQuery(model);\n const attributeRenames = React.useMemo(\n () => configuration?.contentType?.attributeRenames ?? {},\n [configuration?.contentType?.attributeRenames]\n );\n /**\n * The schema can be cached before this configuration response arrives. Dropping\n * unknown column names in that window deletes a renamed field before its new\n * name is known, and the browser cannot get it back.\n */\n const configurationReady = configuration?.contentType?.uid === model;\n\n const [displayedHeaderNames, setDisplayedHeaderNames] = useScopedPersistentState<string[] | null>(\n `STRAPI_LIST_VIEW_DISPLAYED_HEADERS:${model}`,\n null\n );\n\n const mapDisplayedHeaders = React.useCallback(\n (headers: ListFieldLayout[]) => headers.map((header) => header.name),\n []\n );\n\n const displayedHeaders: ListFieldLayout[] = React.useMemo(() => {\n if (\n !displayedHeaderNames ||\n !list.metadatas ||\n Object.keys(list.metadatas).length <= 0 ||\n !schema?.attributes ||\n !listViewConversionContext\n )\n return [];\n\n return convertListLayoutToFieldLayouts(\n displayedHeaderNames,\n schema.attributes,\n list.metadatas,\n {\n configurations: listViewConversionContext.componentConfigurations,\n schemas: listViewConversionContext.componentSchemas,\n },\n listViewConversionContext.contentTypeSchemas\n );\n }, [displayedHeaderNames, schema, list, listViewConversionContext]);\n\n const handleSetHeaders = React.useCallback(\n (headers: string[]) => {\n setDisplayedHeaderNames(headers);\n },\n [setDisplayedHeaderNames]\n );\n\n const handleResetHeaders = React.useCallback(() => {\n setDisplayedHeaderNames(mapDisplayedHeaders(list.layout));\n }, [list.layout, mapDisplayedHeaders, setDisplayedHeaderNames]);\n\n /**\n * If the persistent displayedHeaders are not yet initialized, set them to list.layout\n */\n React.useEffect(() => {\n // wait for list.layout to be loaded\n if (list.layout.length === 0) {\n return;\n }\n\n if (!displayedHeaderNames) {\n handleResetHeaders();\n }\n }, [displayedHeaderNames, handleResetHeaders, list.layout]);\n\n React.useEffect(() => {\n if (!configurationReady || !schema?.attributes) return;\n if (!displayedHeaderNames || displayedHeaderNames.length === 0) return;\n if (schema.uid !== model) return;\n\n const nextHeaders = applyAttributeRenamesToHeaders(\n displayedHeaderNames,\n schema.attributes,\n attributeRenames\n );\n const headersChanged = nextHeaders.some((name, index) => name !== displayedHeaderNames[index]);\n\n if (headersChanged || nextHeaders.length !== displayedHeaderNames.length) {\n handleSetHeaders(nextHeaders);\n }\n }, [\n attributeRenames,\n configurationReady,\n displayedHeaderNames,\n handleSetHeaders,\n model,\n schema?.attributes,\n schema?.uid,\n ]);\n\n const [{ query }, setQuery] = useQueryParams<ListViewQuery>({\n page: '1',\n pageSize: list.settings.pageSize.toString(),\n sort: list.settings.defaultSortBy\n ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}`\n : '',\n });\n\n React.useEffect(() => {\n if (!configurationReady || !schema?.attributes || schema.uid !== model) {\n return;\n }\n\n const nextSort =\n typeof query.sort === 'string'\n ? applyAttributeRenamesToSort(query.sort, schema.attributes, attributeRenames)\n : query.sort;\n const nextFilters = query.filters\n ? applyAttributeRenamesToFilters(query.filters, schema.attributes, attributeRenames)\n : query.filters;\n const sortChanged = nextSort !== query.sort;\n const filtersChanged = JSON.stringify(nextFilters) !== JSON.stringify(query.filters);\n\n if (!sortChanged && !filtersChanged) {\n return;\n }\n\n setQuery(\n withEncodedUserParams(query, {\n ...(sortChanged ? { sort: nextSort } : {}),\n ...(filtersChanged ? { filters: deepEncodeQueryValues(nextFilters) } : {}),\n }),\n 'push',\n true\n );\n }, [\n attributeRenames,\n configurationReady,\n model,\n query,\n schema?.attributes,\n schema?.uid,\n setQuery,\n ]);\n\n const params = React.useMemo(() => {\n if (!configurationReady || !schema?.attributes || schema.uid !== model) {\n return buildValidParams(query);\n }\n\n return buildValidParams({\n ...query,\n ...(typeof query.sort === 'string'\n ? {\n sort: applyAttributeRenamesToSort(query.sort, schema.attributes, attributeRenames),\n }\n : {}),\n ...(query.filters\n ? {\n filters: applyAttributeRenamesToFilters(\n query.filters,\n schema.attributes,\n attributeRenames\n ),\n }\n : {}),\n });\n }, [attributeRenames, configurationReady, model, query, schema?.attributes, schema?.uid]);\n const hasAppliedFilters = (query.filters?.$and?.length ?? 0) > 0;\n const hasStatusFilter = Boolean(\n query.filters?.$and?.some(\n (filter) => filter.__status?.$eq !== undefined && filter.__status.$eq !== null\n )\n );\n\n // If a __status filter becomes active while sort=status:* is in the URL, strip the status sort.\n React.useEffect(() => {\n if (\n hasStatusFilter &&\n typeof query.sort === 'string' &&\n /(?:^|,)\\s*status:/i.test(query.sort)\n ) {\n const cleaned = query.sort\n .split(',')\n .map((s) => s.trim())\n .filter((s) => !/^status:(ASC|DESC)$/i.test(s))\n .join(',');\n setQuery(withEncodedUserParams(query, { sort: cleaned || undefined }), 'push', true);\n }\n }, [hasStatusFilter, query, setQuery]);\n\n const { data, error, isLoading, isFetching } = useGetAllDocumentsQuery(\n {\n model,\n params,\n },\n { skip: isLoadingLayout || !isHydrated }\n );\n\n /**\n * If the API returns an error, display a notification\n */\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const { results = [], pagination } = data ?? {};\n\n React.useEffect(() => {\n if (pagination && pagination.pageCount > 0 && pagination.page > pagination.pageCount) {\n navigate(\n {\n search: stringify({\n ...query,\n page: pagination.pageCount,\n }),\n },\n { replace: true }\n );\n }\n }, [pagination, formatMessage, query, navigate]);\n\n const { canCreate, isLoadingActionsRBAC } = useDocumentRBAC(\n 'ListViewPage',\n ({ canCreate, isLoading }) => ({\n canCreate,\n isLoadingActionsRBAC: isLoading,\n })\n );\n\n const runHookWaterfall = useStrapiApp('ListViewPage', ({ runHookWaterfall }) => runHookWaterfall);\n /**\n * Run the waterfall and then inject our additional table headers.\n */\n const tableHeaders = React.useMemo(() => {\n const headers = runHookWaterfall(INJECT_COLUMN_IN_TABLE, {\n displayedHeaders,\n layout: list,\n });\n\n const formattedHeaders = headers.displayedHeaders.map<ListFieldLayout>((header) => {\n /**\n * When the header label is a string, it is an attribute on the current content-type:\n * Use the attribute name value to compute the translation.\n * Otherwise, it should be a translation object coming from a plugin that injects into the table (ie i18n, content-releases, review-workflows):\n * Use the translation object as is.\n */\n const translation =\n typeof header.label === 'string'\n ? {\n id: `content-manager.content-types.${model}.${header.name}`,\n defaultMessage: header.label,\n }\n : header.label;\n\n return {\n ...header,\n label: formatMessage(translation),\n name: `${header.name}${header.mainField?.name ? `.${header.mainField.name}` : ''}`,\n };\n });\n\n if (schema?.options?.draftAndPublish) {\n formattedHeaders.push({\n attribute: {\n type: 'custom',\n },\n name: 'status',\n label: formatMessage({\n id: getTranslation(`containers.list.table-headers.status`),\n defaultMessage: 'status',\n }),\n searchable: false,\n sortable: !hasStatusFilter,\n } satisfies ListFieldLayout);\n }\n\n return formattedHeaders;\n }, [\n displayedHeaders,\n formatMessage,\n hasStatusFilter,\n list,\n runHookWaterfall,\n schema?.options?.draftAndPublish,\n model,\n ]);\n\n if (isLoadingLayout || !isHydrated || isLoading || isLoadingActionsRBAC) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n const contentTypeTitle = schema?.info.displayName\n ? formatMessage({ id: schema.info.displayName, defaultMessage: schema.info.displayName })\n : formatMessage({\n id: 'content-manager.containers.untitled',\n defaultMessage: 'Untitled',\n });\n\n const handleRowClick = (id: Modules.Documents.ID) => () => {\n trackUsage('willEditEntryFromList');\n navigate({\n pathname: id.toString(),\n search: stringify({ plugins: query.plugins }),\n });\n };\n\n /**\n * The entry link is rendered on the first non-interactive column *that has a\n * value for the row* (resolved per row, so an empty cell — rendered as \"-\" —\n * is skipped and the next candidate carries the link instead). Any scalar\n * column qualifies — text, numbers, dates (createdAt/updatedAt), `id`, and\n * `documentId` (its id text becomes the link, the copy button stays separate).\n * Only genuinely interactive cells are skipped: relations, media, components,\n * dynamic zones (they embed their own links/menus), plugin-formatted columns\n * (`cellFormatter`), and the synthetic `status` column.\n */\n const linkCandidates = tableHeaders.filter(\n ({ name, attribute, cellFormatter }) =>\n name !== 'status' &&\n typeof cellFormatter !== 'function' &&\n attribute &&\n !NON_LINKABLE_TYPES.has(attribute.type)\n );\n\n // The link column for a given row: the first candidate that actually has a\n // value (uses CellContent's own hasContent so it matches the \"-\" the cell\n // would otherwise render). documentId is checked directly (its own cell).\n const getRowLinkField = (row: (typeof results)[number]) =>\n linkCandidates.find((header) => {\n if (header.name === 'documentId') {\n return Boolean(row.documentId);\n }\n const value = row[header.name.split('.')[0]];\n return hasContent(value, header.mainField, header.attribute);\n })?.name;\n\n const isEmptyState = !isFetching && results.length === 0;\n\n const endActions = (\n <>\n {isMobile && list.settings.filterable && schema && <Filters.Trigger />}\n <InjectionZone area=\"listView.actions\" />\n <ViewSettingsMenu\n setHeaders={handleSetHeaders}\n resetHeaders={handleResetHeaders}\n headers={displayedHeaderNames ?? []}\n />\n </>\n );\n\n const searchInput = (\n <>\n {list.settings.searchable && (\n <SearchInput\n label={formatMessage(\n { id: 'app.component.search.label', defaultMessage: 'Search for {target}' },\n { target: contentTypeTitle }\n )}\n placeholder={formatMessage({\n id: 'global.search',\n defaultMessage: 'Search',\n })}\n trackedEvent=\"didSearch\"\n />\n )}\n </>\n );\n\n const startActions = (\n <>\n {searchInput}\n {!isMobile && list.settings.filterable && schema && (\n <>\n <Filters.Trigger />\n <Filters.List />\n </>\n )}\n </>\n );\n\n const actions =\n list.settings.filterable && schema ? (\n <Filters.Root schema={schema} layout={list}>\n <Layouts.Action\n endActions={endActions}\n startActions={startActions}\n bottomActions={isMobile && hasAppliedFilters ? <Filters.List /> : null}\n />\n <Filters.Popover />\n </Filters.Root>\n ) : (\n <Layouts.Action endActions={endActions} startActions={startActions} />\n );\n\n return (\n <>\n <tours.contentManager.Introduction>\n {/* Invisible Anchor */}\n <Box />\n </tours.contentManager.Introduction>\n <Page.Main>\n <Page.Title>{`${contentTypeTitle}`}</Page.Title>\n <LayoutsHeaderCustom\n primaryAction={\n canCreate ? (\n <tours.contentManager.CreateNewEntry>\n <CreateButton />\n </tours.contentManager.CreateNewEntry>\n ) : null\n }\n subtitle={formatMessage(\n {\n id: getTranslation('pages.ListView.header-subtitle'),\n defaultMessage:\n '{number, plural, =0 {# entries} one {# entry} other {# entries}} found',\n },\n { number: pagination?.total }\n )}\n title={contentTypeTitle}\n navigationAction={<BackButton />}\n />\n {actions}\n <Layouts.Content>\n {isEmptyState ? (\n <Box background=\"neutral0\" shadow=\"filterShadow\" hasRadius>\n <EmptyStateLayout\n action={\n canCreate && (\n <Box>\n <CreateButton variant=\"secondary\" />\n </Box>\n )\n }\n content={formatMessage({\n id: 'app.components.EmptyStateLayout.content-document',\n defaultMessage: 'No content found',\n })}\n hasRadius\n icon={<EmptyDocuments width=\"16rem\" />}\n />\n </Box>\n ) : (\n <Flex gap={4} direction=\"column\" alignItems=\"stretch\">\n <Table.Root rows={results} headers={tableHeaders} isLoading={isFetching}>\n <TableActionsBar />\n <Table.Content>\n <Table.Head>\n <Table.HeaderCheckboxCell />\n {tableHeaders.map((header: ListFieldLayout) => (\n <Table.HeaderCell key={header.name} {...header} />\n ))}\n </Table.Head>\n <Table.Loading />\n <Table.Empty action={canCreate ? <CreateButton variant=\"secondary\" /> : null} />\n <Table.Body>\n {results.map((row) => {\n const rowLinkField = getRowLinkField(row);\n return (\n <Table.Row\n cursor=\"pointer\"\n key={row.id}\n onClick={handleRowClick(row.documentId)}\n >\n <Table.CheckboxCell id={row.id} />\n {tableHeaders.map(({ cellFormatter, ...header }) => {\n if (header.name === 'status') {\n const { status } = row;\n\n return (\n <Table.Cell key={header.name}>\n <DocumentStatus status={status} maxWidth={'min-content'} />\n </Table.Cell>\n );\n }\n if (['createdBy', 'updatedBy'].includes(header.name.split('.')[0])) {\n // Display the users full name\n // Some entries doesn't have a user assigned as creator/updater (ex: entries created through content API)\n // In this case, we display a dash\n return (\n <Table.Cell key={header.name}>\n <Typography textColor=\"neutral800\">\n {row[header.name.split('.')[0]]\n ? getDisplayName(row[header.name.split('.')[0]])\n : '-'}\n </Typography>\n </Table.Cell>\n );\n }\n if (header.name === 'documentId') {\n // When documentId is the primary link column, only its\n // id text becomes the link; the copy button stays outside.\n const isDocumentIdLink =\n header.name === rowLinkField && Boolean(row.documentId);\n return (\n <Table.Cell key={header.name}>\n <Flex gap={2} alignItems=\"center\" width=\"100%\" minWidth={0}>\n {isDocumentIdLink ? (\n <Typography\n tag={ReactRouterLink}\n to={{\n pathname: row.documentId,\n search: stringify({ plugins: query.plugins }),\n }}\n onClick={(e: React.MouseEvent) => e.stopPropagation()}\n textColor=\"neutral800\"\n maxWidth=\"30rem\"\n ellipsis\n >\n {row.documentId}\n </Typography>\n ) : (\n <Typography textColor=\"neutral800\" maxWidth=\"30rem\" ellipsis>\n {row.documentId || '-'}\n </Typography>\n )}\n {row.documentId && (\n <IconButton\n variant=\"ghost\"\n size=\"S\"\n label={formatMessage({\n id: 'content-manager.actions.copy-documentId.label',\n defaultMessage: 'Copy',\n })}\n onClick={(e) => handleCopyDocumentId(e, row.documentId)}\n >\n <Duplicate />\n </IconButton>\n )}\n </Flex>\n </Table.Cell>\n );\n }\n if (typeof cellFormatter === 'function') {\n return (\n <Table.Cell key={header.name}>\n {/* @ts-expect-error – TODO: fix this TS error */}\n {cellFormatter(row, header, { collectionType, model })}\n </Table.Cell>\n );\n }\n return (\n <Table.Cell key={header.name}>\n <CellContent\n content={row[header.name.split('.')[0]]}\n rowId={row.documentId}\n {...header}\n linkTo={\n header.name === rowLinkField\n ? {\n pathname: row.documentId,\n search: stringify({ plugins: query.plugins }),\n }\n : undefined\n }\n />\n </Table.Cell>\n );\n })}\n {/* we stop propagation here to allow the menu to trigger it's events without triggering the row redirect */}\n <ActionsCell onClick={(e) => e.stopPropagation()}>\n <TableActions document={row} />\n </ActionsCell>\n </Table.Row>\n );\n })}\n </Table.Body>\n </Table.Content>\n </Table.Root>\n <Pagination.Root\n {...pagination}\n defaultPageSize={list.settings.pageSize}\n onPageSizeChange={() => trackUsage('willChangeNumberOfEntriesPerPage')}\n >\n <Pagination.PageSize />\n <Pagination.Links />\n </Pagination.Root>\n </Flex>\n )}\n </Layouts.Content>\n </Page.Main>\n </>\n );\n};\n\nconst ActionsCell = styled(Table.Cell)`\n display: flex;\n justify-content: flex-end;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionsBar\n * -----------------------------------------------------------------------------------------------*/\n\nconst TableActionsBar = () => {\n const selectRow = useTable('TableActionsBar', (state) => state.selectRow);\n const [{ query }] = useQueryParams<{ plugins: { i18n: { locale: string } } }>();\n const locale = query?.plugins?.i18n?.locale;\n const prevLocale = usePrev(locale);\n\n // TODO: find a better way to reset the selected rows when the locale changes across all the app\n React.useEffect(() => {\n if (prevLocale !== locale) {\n selectRow([]);\n }\n }, [selectRow, prevLocale, locale]);\n\n return (\n <Table.ActionBar>\n <BulkActionsRenderer />\n </Table.ActionBar>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * CreateButton\n * -----------------------------------------------------------------------------------------------*/\n\ninterface CreateButtonProps extends Pick<ButtonProps, 'variant'> {}\n\nconst CreateButton = ({ variant }: CreateButtonProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const [{ query }] = useQueryParams<{ plugins: object }>();\n\n return (\n <Button\n variant={variant}\n tag={ReactRouterLink}\n onClick={() => {\n trackUsage('willCreateEntry', { status: 'draft' });\n }}\n startIcon={<Plus />}\n style={{ textDecoration: 'none' }}\n to={{\n pathname: 'create',\n search: stringify({ plugins: query.plugins }),\n }}\n minWidth=\"max-content\"\n fullWidth\n >\n {formatMessage({\n id: getTranslation('HeaderLayout.button.label-add-entry'),\n defaultMessage: 'Create new entry',\n })}\n </Button>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedListViewPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedListViewPage = () => {\n const { slug = '' } = useParams<{\n slug: string;\n }>();\n const {\n permissions = [],\n isLoading,\n error,\n } = useRBAC(\n PERMISSIONS.map((action) => ({\n action,\n subject: slug,\n }))\n );\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n if (error || !slug) {\n return <Page.Error />;\n }\n\n return (\n <Page.Protect permissions={permissions}>\n {({ permissions }) => (\n <DocumentRBAC permissions={permissions}>\n <ListViewPage key={slug} />\n </DocumentRBAC>\n )}\n </Page.Protect>\n );\n};\n\nexport { ListViewPage, ProtectedListViewPage };\n"],"names":["INJECT_COLUMN_IN_TABLE","HOOKS","NON_LINKABLE_TYPES","Set","LayoutsHeaderCustom","styled","Layouts","Header","ListViewPage","trackUsage","useTracking","navigate","useNavigate","formatMessage","useIntl","toggleNotification","useNotification","copy","useClipboard","_unstableFormatAPIError","formatAPIError","useAPIErrorHandler","getTranslation","isMobile","useIsMobile","handleCopyDocumentId","React","useCallback","e","documentId","stopPropagation","didCopy","type","message","id","defaultMessage","collectionType","model","schema","useDoc","list","listViewConversionContext","isLoading","isLoadingLayout","useDocumentLayout","persistentQueryConfigs","useMemo","paths","scoped","STRAPI_LOCALE","isHydrated","usePersistentPartialQueryParams","currentData","configuration","useGetContentTypeConfigurationQuery","attributeRenames","contentType","configurationReady","uid","displayedHeaderNames","setDisplayedHeaderNames","useScopedPersistentState","mapDisplayedHeaders","headers","map","header","name","displayedHeaders","metadatas","Object","keys","length","attributes","convertListLayoutToFieldLayouts","configurations","componentConfigurations","schemas","componentSchemas","contentTypeSchemas","handleSetHeaders","handleResetHeaders","layout","useEffect","nextHeaders","applyAttributeRenamesToHeaders","headersChanged","some","index","query","setQuery","useQueryParams","page","pageSize","settings","toString","sort","defaultSortBy","defaultSortOrder","nextSort","applyAttributeRenamesToSort","nextFilters","filters","applyAttributeRenamesToFilters","sortChanged","filtersChanged","JSON","stringify","withEncodedUserParams","deepEncodeQueryValues","params","buildValidParams","hasAppliedFilters","$and","hasStatusFilter","Boolean","filter","__status","$eq","undefined","test","cleaned","split","s","trim","join","data","error","isFetching","useGetAllDocumentsQuery","skip","results","pagination","pageCount","search","replace","canCreate","isLoadingActionsRBAC","useDocumentRBAC","runHookWaterfall","useStrapiApp","tableHeaders","formattedHeaders","translation","label","mainField","options","draftAndPublish","push","attribute","searchable","sortable","_jsx","Page","Loading","Error","contentTypeTitle","info","displayName","handleRowClick","pathname","plugins","linkCandidates","cellFormatter","has","getRowLinkField","row","find","value","hasContent","isEmptyState","endActions","_jsxs","_Fragment","filterable","Filters","Trigger","InjectionZone","area","ViewSettingsMenu","setHeaders","resetHeaders","searchInput","SearchInput","target","placeholder","trackedEvent","startActions","List","actions","Root","Action","bottomActions","Popover","tours","contentManager","Introduction","Box","Main","Title","primaryAction","CreateNewEntry","CreateButton","subtitle","number","total","title","navigationAction","BackButton","Content","background","shadow","hasRadius","EmptyStateLayout","action","variant","content","icon","EmptyDocuments","width","Flex","gap","direction","alignItems","Table","rows","TableActionsBar","Head","HeaderCheckboxCell","HeaderCell","Empty","Body","rowLinkField","Row","cursor","onClick","CheckboxCell","status","Cell","DocumentStatus","maxWidth","includes","Typography","textColor","getDisplayName","isDocumentIdLink","minWidth","tag","ReactRouterLink","to","ellipsis","IconButton","size","Duplicate","CellContent","rowId","linkTo","ActionsCell","TableActions","document","Pagination","defaultPageSize","onPageSizeChange","PageSize","Links","selectRow","useTable","state","locale","i18n","prevLocale","usePrev","ActionBar","BulkActionsRenderer","Button","startIcon","Plus","style","textDecoration","fullWidth","ProtectedListViewPage","slug","useParams","permissions","useRBAC","PERMISSIONS","subject","Protect","DocumentRBAC"],"mappings":"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"}
|