@strapi/content-manager 5.47.1 → 5.48.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/features/DocumentRBAC.js +9 -1
- package/dist/admin/features/DocumentRBAC.js.map +1 -1
- package/dist/admin/features/DocumentRBAC.mjs +9 -1
- package/dist/admin/features/DocumentRBAC.mjs.map +1 -1
- package/dist/admin/hooks/useContentTypeSchema.js +37 -17
- package/dist/admin/hooks/useContentTypeSchema.js.map +1 -1
- package/dist/admin/hooks/useContentTypeSchema.mjs +37 -17
- package/dist/admin/hooks/useContentTypeSchema.mjs.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.js +43 -4
- package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
- package/dist/admin/hooks/useDocumentLayout.mjs +43 -4
- package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.js +6 -3
- package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ComponentConfigurationPage.mjs +6 -3
- package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Code.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +5 -2
- package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.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/DynamicZone/DynamicComponent.js +11 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +11 -2
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs +9 -4
- package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/Field.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js +2 -26
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.js.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs +2 -26
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/PreviewWysiwyg.mjs.map +1 -1
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js +72 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.js.map +1 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs +70 -0
- package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.mjs.map +1 -0
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js +4 -8
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs +5 -9
- package/dist/admin/pages/ListConfiguration/ListConfigurationPage.mjs.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js +6 -10
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs +6 -10
- package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.js +7 -9
- package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
- package/dist/admin/pages/ListView/components/Filters.mjs +7 -9
- package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.js +5 -4
- package/dist/admin/pages/ListView/components/TableCells/Media.js.map +1 -1
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs +5 -4
- package/dist/admin/pages/ListView/components/TableCells/Media.mjs.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js +15 -9
- package/dist/admin/pages/formatComponentConfigurationEditLayout.js.map +1 -1
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs +15 -9
- package/dist/admin/pages/formatComponentConfigurationEditLayout.mjs.map +1 -1
- package/dist/admin/services/components.js +3 -2
- package/dist/admin/services/components.js.map +1 -1
- package/dist/admin/services/components.mjs +3 -2
- package/dist/admin/services/components.mjs.map +1 -1
- package/dist/admin/services/contentTypes.js +4 -3
- package/dist/admin/services/contentTypes.js.map +1 -1
- package/dist/admin/services/contentTypes.mjs +4 -3
- package/dist/admin/services/contentTypes.mjs.map +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Component/Input.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.d.ts +1 -1
- package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/sanitizer.d.ts +2 -0
- package/dist/admin/src/pages/ListConfiguration/components/SortDisplayedFields.d.ts +2 -2
- package/dist/admin/src/pages/ListView/components/TableCells/Media.d.ts +2 -2
- package/dist/admin/src/pages/formatComponentConfigurationEditLayout.d.ts +3 -1
- package/dist/admin/src/utils/layouts/normalizeContentManagerLayout.d.ts +24 -0
- package/dist/admin/translations/en.json.js +1 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +1 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/admin/utils/attributes.js +17 -2
- package/dist/admin/utils/attributes.js.map +1 -1
- package/dist/admin/utils/attributes.mjs +17 -2
- package/dist/admin/utils/attributes.mjs.map +1 -1
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.js +329 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.js.map +1 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs +321 -0
- package/dist/admin/utils/layouts/normalizeContentManagerLayout.mjs.map +1 -0
- package/dist/server/controllers/collection-types.js +7 -2
- package/dist/server/controllers/collection-types.js.map +1 -1
- package/dist/server/controllers/collection-types.mjs +7 -2
- package/dist/server/controllers/collection-types.mjs.map +1 -1
- package/dist/server/homepage/services/homepage-query-utils.js +56 -0
- package/dist/server/homepage/services/homepage-query-utils.js.map +1 -0
- package/dist/server/homepage/services/homepage-query-utils.mjs +50 -0
- package/dist/server/homepage/services/homepage-query-utils.mjs.map +1 -0
- package/dist/server/homepage/services/homepage.js +29 -29
- package/dist/server/homepage/services/homepage.js.map +1 -1
- package/dist/server/homepage/services/homepage.mjs +29 -29
- package/dist/server/homepage/services/homepage.mjs.map +1 -1
- package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts +28 -0
- package/dist/server/src/homepage/services/homepage-query-utils.d.ts.map +1 -0
- package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
- package/package.json +8 -8
|
@@ -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 { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\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, 'layout'> {}\n\nconst SortDisplayedFields = () => {\n const { formatMessage } = useIntl();\n const { model, 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.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 const { metadata: allMetadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\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 { list: metadata } = allMetadata[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 }, [allMetadata, 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","formatMessage","useIntl","model","schema","useDoc","isDraggingSibling","setIsDraggingSibling","React","useState","lastAction","setLastAction","scrollableContainerRef","useRef","values","useForm","state","layout","addFieldRow","removeFieldRow","moveFieldRow","metadata","allMetadata","useGetContentTypeConfigurationQuery","selectFromResult","data","contentType","metadatas","nonDisplayedFields","useMemo","displayedFieldNames","map","field","name","Object","entries","attributes","reduce","acc","attribute","includes","checkIfAttributeIsDisplayable","list","push","label","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.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,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,MAAM,EAAE,GAAGC,MAAAA,EAAAA;AACnB,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;AACjE,IAAA,MAAM,CAACC,UAAAA,EAAYC,aAAAA,CAAc,GAAGH,KAAAA,CAAMC,QAAQ,CAAgB,IAAA,CAAA;IAClE,MAAMG,sBAAAA,GAAyBJ,KAAAA,CAAMK,MAAM,CAAiB,IAAA,CAAA;IAE5D,MAAMC,MAAAA,GAASC,OAAAA,CACb,qBAAA,EACA,CAACC,KAAAA,GAAUA,MAAMF,MAAM,CAACG,MAAM,IAAI,EAAE,CAAA;AAEtC,IAAA,MAAMC,cAAcH,OAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAME,WAAW,CAAA;AAC/E,IAAA,MAAMC,iBAAiBJ,OAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAMG,cAAc,CAAA;AACrF,IAAA,MAAMC,eAAeL,OAAAA,CAAQ,qBAAA,EAAuB,CAACC,KAAAA,GAAUA,MAAMI,YAAY,CAAA;AAEjF;;;AAGC,MACD,MAAMC,kBAAAA,GAAqBb,KAAAA,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,8BAA8BF,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,KAAAA,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,IAAA,CAACC,IAAAA,EAAAA;QAAKC,UAAAA,EAAW,SAAA;QAAUC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;;0BACjDC,GAAA,CAACC,UAAAA,EAAAA;gBAAWC,OAAAA,EAAQ,OAAA;gBAAQC,GAAAA,EAAI,IAAA;0BAC7BvD,aAAAA,CAAc;AACbwD,oBAAAA,EAAAA,EAAIC,cAAAA,CAAe,6BAAA,CAAA;oBACnBC,cAAAA,EAAgB;AAClB,iBAAA;;0BAGFX,IAAA,CAACC,IAAAA,EAAAA;gBAAKW,OAAAA,EAAS,CAAA;gBAAGC,WAAAA,EAAY,YAAA;gBAAaC,WAAAA,EAAY,QAAA;gBAASC,WAAAA,EAAY,KAAA;gBAAMC,SAAS,EAAA,IAAA;;kCACzFX,GAAA,CAACY,GAAAA,EAAAA;wBAAIC,IAAAA,EAAK,GAAA;wBAAIC,QAAAA,EAAS,aAAA;wBAAcC,GAAAA,EAAKzD,sBAAAA;AACxC,wBAAA,QAAA,gBAAA0C,GAAA,CAACJ,IAAAA,EAAAA;4BAAKG,GAAAA,EAAK,CAAA;AACRvC,4BAAAA,QAAAA,EAAAA,MAAAA,CAAOU,GAAG,CAAC,CAACC,KAAAA,EAAOgB,sBAClBa,GAAA,CAACgB,aAAAA,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,IAAA,CAACwB,KAAKC,IAAI,EAAA;;AACR,0CAAAzB,IAAA,CAACwB,KAAKE,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,GAAA,CAAC4B,cAAAA,EAAAA;wCAAezB,GAAAA,EAAI,MAAA;kDACjBvD,aAAAA,CAAc;AACbwD,4CAAAA,EAAAA,EAAIC,cAAAA,CAAe,8BAAA,CAAA;4CACnBC,cAAAA,EAAgB;AAClB,yCAAA;;kDAEFN,GAAA,CAAC6B,IAAAA,EAAAA;wCAAKC,aAAW,EAAA,IAAA;wCAACC,SAAAA,EAAW,KAAA;wCAAOC,KAAAA,EAAO;4CAAEC,QAAAA,EAAU,UAAA;4CAAYC,GAAAA,EAAK;AAAE;;;;AAE5E,0CAAAlC,GAAA,CAACmB,KAAKgB,OAAO,EAAA;AACVpE,gCAAAA,QAAAA,EAAAA,kBAAAA,CAAmBG,GAAG,CAAC,CAACC,KAAAA,iBACvB6B,GAAA,CAACmB,KAAKiB,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;;;;"}
|
|
@@ -9,7 +9,6 @@ var attributes = require('../../../constants/attributes.js');
|
|
|
9
9
|
var hooks = require('../../../constants/hooks.js');
|
|
10
10
|
var useContentTypeSchema = require('../../../hooks/useContentTypeSchema.js');
|
|
11
11
|
var useDebounce = require('../../../hooks/useDebounce.js');
|
|
12
|
-
var contentTypes = require('../../../services/contentTypes.js');
|
|
13
12
|
var attributes$1 = require('../../../utils/attributes.js');
|
|
14
13
|
var translations = require('../../../utils/translations.js');
|
|
15
14
|
var users = require('../../../utils/users.js');
|
|
@@ -90,11 +89,6 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
90
89
|
skip: selectedUserIds.length === 0 || !canReadAdminUsers
|
|
91
90
|
});
|
|
92
91
|
const { users: users$1 = [] } = userData ?? {};
|
|
93
|
-
const { metadata } = contentTypes.useGetContentTypeConfigurationQuery(model, {
|
|
94
|
-
selectFromResult: ({ data })=>({
|
|
95
|
-
metadata: data?.contentType.metadatas ?? {}
|
|
96
|
-
})
|
|
97
|
-
});
|
|
98
92
|
const formatter = designSystem.useCollator(locale, {
|
|
99
93
|
sensitivity: 'base'
|
|
100
94
|
});
|
|
@@ -166,10 +160,14 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
166
160
|
};
|
|
167
161
|
}
|
|
168
162
|
const attribute = attributes$2[name];
|
|
169
|
-
if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {
|
|
163
|
+
if (!attribute || NOT_ALLOWED_FILTERS.includes(attribute.type)) {
|
|
164
|
+
return null;
|
|
165
|
+
}
|
|
166
|
+
const fieldMetadata = layout.metadatas?.[name];
|
|
167
|
+
if (!fieldMetadata) {
|
|
170
168
|
return null;
|
|
171
169
|
}
|
|
172
|
-
const { mainField: mainFieldName = '', label } =
|
|
170
|
+
const { mainField: mainFieldName = '', label } = fieldMetadata;
|
|
173
171
|
let filter = {
|
|
174
172
|
name,
|
|
175
173
|
label: label ?? '',
|
|
@@ -253,7 +251,7 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
253
251
|
canReadAdminUsers,
|
|
254
252
|
model,
|
|
255
253
|
attributes$2,
|
|
256
|
-
|
|
254
|
+
layout.metadatas,
|
|
257
255
|
schemas,
|
|
258
256
|
layout,
|
|
259
257
|
users$1,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.js","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { HOOKS } from '../../../constants/hooks';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\nimport { getDisplayName } from '../../../utils/users';\n\nimport type { InjectableListViewFilter } from '../../../constants/hooks';\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\n\nconst { INJECT_LIST_VIEW_FILTERS } = HOOKS;\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n layout: ListLayout;\n children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, layout, children }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n const runHookWaterfall = useStrapiApp('FiltersImpl', ({ runHookWaterfall }) => runHookWaterfall);\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n const baseFilters = [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n type: attribute.type as Filters.Filter['type'],\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[];\n\n // Let plugins inject their own filters.\n // `layout.options` is a merge of schema/pluginOptions/contentType options —\n // mirrors the column-injection hook contract.\n const { displayedFilters: extendedFilters } = runHookWaterfall(INJECT_LIST_VIEW_FILTERS, {\n displayedFilters: baseFilters as InjectableListViewFilter[],\n layout,\n });\n\n const resolveLabel = (label: string | MessageDescriptor): string =>\n typeof label === 'string' ? label : formatMessage(label);\n\n const userOptions = users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n }));\n\n const formatted = extendedFilters.map<Filters.Filter>((filter) => {\n const next: Filters.Filter = {\n ...filter,\n label: resolveLabel(filter.label),\n operators: filter.operators?.map((op) => ({ ...op, label: resolveLabel(op.label) })),\n };\n\n // User-typed filters need user options so the chip can render the display name instead of the id.\n if (USER_FILTER_ATTRIBUTES.includes(filter.name) && !next.options?.length) {\n next.options = userOptions;\n }\n\n return next;\n });\n\n return formatted.toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n layout,\n users,\n formatMessage,\n formatter,\n options?.draftAndPublish,\n runHookWaterfall,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n {children}\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["INJECT_LIST_VIEW_FILTERS","HOOKS","NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","layout","children","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","runHookWaterfall","useStrapiApp","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","baseFilters","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","mainField","mainFieldName","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","extendedFilters","resolveLabel","userOptions","formatted","next","op","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Filters.js","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { HOOKS } from '../../../constants/hooks';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { getMainField } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\nimport { getDisplayName } from '../../../utils/users';\n\nimport type { InjectableListViewFilter } from '../../../constants/hooks';\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\n\nconst { INJECT_LIST_VIEW_FILTERS } = HOOKS;\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n layout: ListLayout;\n children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, layout, children }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n const runHookWaterfall = useStrapiApp('FiltersImpl', ({ runHookWaterfall }) => runHookWaterfall);\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n const baseFilters = [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\n const attribute = attributes[name];\n\n if (!attribute || NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const fieldMetadata = layout.metadatas?.[name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = fieldMetadata;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n type: attribute.type as Filters.Filter['type'],\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[];\n\n // Let plugins inject their own filters.\n // `layout.options` is a merge of schema/pluginOptions/contentType options —\n // mirrors the column-injection hook contract.\n const { displayedFilters: extendedFilters } = runHookWaterfall(INJECT_LIST_VIEW_FILTERS, {\n displayedFilters: baseFilters as InjectableListViewFilter[],\n layout,\n });\n\n const resolveLabel = (label: string | MessageDescriptor): string =>\n typeof label === 'string' ? label : formatMessage(label);\n\n const userOptions = users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n }));\n\n const formatted = extendedFilters.map<Filters.Filter>((filter) => {\n const next: Filters.Filter = {\n ...filter,\n label: resolveLabel(filter.label),\n operators: filter.operators?.map((op) => ({ ...op, label: resolveLabel(op.label) })),\n };\n\n // User-typed filters need user options so the chip can render the display name instead of the id.\n if (USER_FILTER_ATTRIBUTES.includes(filter.name) && !next.options?.length) {\n next.options = userOptions;\n }\n\n return next;\n });\n\n return formatted.toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n layout.metadatas,\n schemas,\n layout,\n users,\n formatMessage,\n formatter,\n options?.draftAndPublish,\n runHookWaterfall,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n {children}\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["INJECT_LIST_VIEW_FILTERS","HOOKS","NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","layout","children","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","runHookWaterfall","useStrapiApp","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","baseFilters","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","fieldMetadata","metadatas","mainField","mainFieldName","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","extendedFilters","resolveLabel","userOptions","formatted","next","op","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"mappings":"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"}
|
|
@@ -7,7 +7,6 @@ import { CREATOR_FIELDS } from '../../../constants/attributes.mjs';
|
|
|
7
7
|
import { HOOKS } from '../../../constants/hooks.mjs';
|
|
8
8
|
import { useContentTypeSchema } from '../../../hooks/useContentTypeSchema.mjs';
|
|
9
9
|
import { useDebounce } from '../../../hooks/useDebounce.mjs';
|
|
10
|
-
import { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes.mjs';
|
|
11
10
|
import { getMainField } from '../../../utils/attributes.mjs';
|
|
12
11
|
import { getTranslation } from '../../../utils/translations.mjs';
|
|
13
12
|
import { getDisplayName } from '../../../utils/users.mjs';
|
|
@@ -69,11 +68,6 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
69
68
|
skip: selectedUserIds.length === 0 || !canReadAdminUsers
|
|
70
69
|
});
|
|
71
70
|
const { users = [] } = userData ?? {};
|
|
72
|
-
const { metadata } = useGetContentTypeConfigurationQuery(model, {
|
|
73
|
-
selectFromResult: ({ data })=>({
|
|
74
|
-
metadata: data?.contentType.metadatas ?? {}
|
|
75
|
-
})
|
|
76
|
-
});
|
|
77
71
|
const formatter = useCollator(locale, {
|
|
78
72
|
sensitivity: 'base'
|
|
79
73
|
});
|
|
@@ -145,10 +139,14 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
145
139
|
};
|
|
146
140
|
}
|
|
147
141
|
const attribute = attributes[name];
|
|
148
|
-
if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {
|
|
142
|
+
if (!attribute || NOT_ALLOWED_FILTERS.includes(attribute.type)) {
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
const fieldMetadata = layout.metadatas?.[name];
|
|
146
|
+
if (!fieldMetadata) {
|
|
149
147
|
return null;
|
|
150
148
|
}
|
|
151
|
-
const { mainField: mainFieldName = '', label } =
|
|
149
|
+
const { mainField: mainFieldName = '', label } = fieldMetadata;
|
|
152
150
|
let filter = {
|
|
153
151
|
name,
|
|
154
152
|
label: label ?? '',
|
|
@@ -232,7 +230,7 @@ const Root = ({ disabled, schema, layout, children })=>{
|
|
|
232
230
|
canReadAdminUsers,
|
|
233
231
|
model,
|
|
234
232
|
attributes,
|
|
235
|
-
|
|
233
|
+
layout.metadatas,
|
|
236
234
|
schemas,
|
|
237
235
|
layout,
|
|
238
236
|
users,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { HOOKS } from '../../../constants/hooks';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { useGetContentTypeConfigurationQuery } from '../../../services/contentTypes';\nimport { getMainField } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\nimport { getDisplayName } from '../../../utils/users';\n\nimport type { InjectableListViewFilter } from '../../../constants/hooks';\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\n\nconst { INJECT_LIST_VIEW_FILTERS } = HOOKS;\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n layout: ListLayout;\n children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, layout, children }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n const runHookWaterfall = useStrapiApp('FiltersImpl', ({ runHookWaterfall }) => runHookWaterfall);\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const { metadata } = useGetContentTypeConfigurationQuery(model, {\n selectFromResult: ({ data }) => ({ metadata: data?.contentType.metadatas ?? {} }),\n });\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n const baseFilters = [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\n const attribute = attributes[name];\n\n if (NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = metadata[name].list;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n type: attribute.type as Filters.Filter['type'],\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[];\n\n // Let plugins inject their own filters.\n // `layout.options` is a merge of schema/pluginOptions/contentType options —\n // mirrors the column-injection hook contract.\n const { displayedFilters: extendedFilters } = runHookWaterfall(INJECT_LIST_VIEW_FILTERS, {\n displayedFilters: baseFilters as InjectableListViewFilter[],\n layout,\n });\n\n const resolveLabel = (label: string | MessageDescriptor): string =>\n typeof label === 'string' ? label : formatMessage(label);\n\n const userOptions = users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n }));\n\n const formatted = extendedFilters.map<Filters.Filter>((filter) => {\n const next: Filters.Filter = {\n ...filter,\n label: resolveLabel(filter.label),\n operators: filter.operators?.map((op) => ({ ...op, label: resolveLabel(op.label) })),\n };\n\n // User-typed filters need user options so the chip can render the display name instead of the id.\n if (USER_FILTER_ATTRIBUTES.includes(filter.name) && !next.options?.length) {\n next.options = userOptions;\n }\n\n return next;\n });\n\n return formatted.toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n metadata,\n schemas,\n layout,\n users,\n formatMessage,\n formatter,\n options?.draftAndPublish,\n runHookWaterfall,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n {children}\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["INJECT_LIST_VIEW_FILTERS","HOOKS","NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","layout","children","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","runHookWaterfall","useStrapiApp","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","metadata","useGetContentTypeConfigurationQuery","selectFromResult","contentType","metadatas","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","baseFilters","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","mainField","mainFieldName","list","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","extendedFilters","resolveLabel","userOptions","formatted","next","op","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"mappings":";;;;;;;;;;;;;;AA2BA,MAAM,EAAEA,wBAAwB,EAAE,GAAGC,KAAAA;AAErC;;AAEC,IACD,MAAMC,mBAAAA,GAAsB;AAC1B,IAAA,MAAA;AACA,IAAA,WAAA;AACA,IAAA,OAAA;AACA,IAAA,UAAA;AACA,IAAA,aAAA;AACA,IAAA,UAAA;AACA,IAAA;AACD,CAAA;AACD,MAAMC,uBAAAA,GAA0B;AAAC,IAAA,WAAA;AAAa,IAAA;AAAY,CAAA;AAC1D,MAAMC,sBAAAA,GAAyB;AAAIC,IAAAA,GAAAA,cAAAA;AAAgB,IAAA;AAAkB,CAAA;AAYrE,MAAMC,IAAAA,GAAO,CAAC,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,MAAM,EAAEC,QAAQ,EAAgB,GAAA;IAChE,MAAM,EAAEC,UAAU,EAAEC,GAAAA,EAAKC,KAAK,EAAEC,OAAO,EAAE,GAAGN,MAAAA;AAC5C,IAAA,MAAM,EAAEO,aAAa,EAAEC,MAAM,EAAE,GAAGC,OAAAA,EAAAA;IAClC,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAMC,iBAAiBC,OAAAA,CAAQ,aAAA,EAAe,CAACC,KAAAA,GAAUA,MAAMC,WAAW,CAAA;AAC1E,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IACpB,MAAM,EAAEC,OAAO,EAAE,GAAGC,oBAAAA,EAAAA;AACpB,IAAA,MAAMC,mBAAmBC,YAAAA,CAAa,aAAA,EAAe,CAAC,EAAED,gBAAgB,EAAE,GAAKA,gBAAAA,CAAAA;IAE/E,MAAME,iBAAAA,GAAoBC,MAAMC,OAAO,CACrC,IACEZ,cAAAA,CAAea,MAAM,CACnB,CAACC,UAAAA,GAAeA,WAAWC,MAAM,KAAK,uBAAuBD,UAAAA,CAAWE,OAAO,KAAK,IAAA,CAAA,CACpFC,MAAM,GAAG,CAAA,EACb;AAACjB,QAAAA;AAAe,KAAA,CAAA;AAGlB,IAAA,MAAMkB,eAAAA,GAAmBd,CAAAA,KAAAA,EAAOe,OAAAA,EAASC,IAAAA,IAAQ,EAAC,EAAGC,MAAM,CAAW,CAACC,GAAAA,EAAKT,MAAAA,GAAAA;QAC1E,MAAM,CAACU,KAAKC,KAAAA,CAAM,GAAGC,OAAOC,OAAO,CAACb,MAAAA,CAAO,CAAC,CAAA,CAAE;AAC9C,QAAA,IAAI,OAAOW,KAAAA,CAAMG,EAAE,KAAK,QAAA,EAAU;YAChC,OAAOL,GAAAA;AACT,QAAA;QAEA,MAAMK,EAAAA,GAAKH,MAAMG,EAAE,CAACC,GAAG,IAAIJ,KAAAA,CAAMG,EAAE,CAACE,GAAG;;QAGvC,MAAMC,SAAAA,GAAYvC,UAAU,CAACgC,GAAAA,CAAI;QACjC,MAAMQ,mBAAAA,GACJD,WAAWE,IAAAA,KAAS,UAAA,IAAc,YAAYF,SAAAA,IAAaA,SAAAA,CAAUG,MAAM,KAAK,aAAA;AAElF,QAAA,IAAIN,EAAAA,KAAOI,mBAAAA,IAAuB/C,sBAAAA,CAAuBkD,QAAQ,CAACX,GAAAA,CAAG,CAAA,IAAM,CAACD,GAAAA,CAAIY,QAAQ,CAACP,EAAAA,CAAAA,EAAK;AAC5FL,YAAAA,GAAAA,CAAIa,IAAI,CAACR,EAAAA,CAAAA;AACX,QAAA;QAEA,OAAOL,GAAAA;AACT,IAAA,CAAA,EAAG,EAAE,CAAA;IAEL,MAAM,EAAEc,MAAMC,QAAQ,EAAEC,WAAWC,mBAAmB,EAAE,GAAGC,aAAAA,CACzD;QAAErB,OAAAA,EAAS;YAAEQ,EAAAA,EAAI;gBAAEc,GAAAA,EAAKvB;AAAgB;AAAE;KAAE,EAC5C;;;AAGEwB,QAAAA,IAAAA,EAAMxB,eAAAA,CAAgBD,MAAM,KAAK,CAAA,IAAK,CAACP;AACzC,KAAA,CAAA;AAGF,IAAA,MAAM,EAAEiC,KAAAA,GAAQ,EAAE,EAAE,GAAGN,YAAY,EAAC;AAEpC,IAAA,MAAM,EAAEO,QAAQ,EAAE,GAAGC,oCAAoCpD,KAAAA,EAAO;AAC9DqD,QAAAA,gBAAAA,EAAkB,CAAC,EAAEV,IAAI,EAAE,IAAM;gBAAEQ,QAAAA,EAAUR,IAAAA,EAAMW,WAAAA,CAAYC,SAAAA,IAAa;aAAG;AACjF,KAAA,CAAA;IAEA,MAAMC,SAAAA,GAAYC,YAAYtD,MAAAA,EAAQ;QACpCuD,WAAAA,EAAa;AACf,KAAA,CAAA;IAEA,MAAMC,gBAAAA,GAAmBzC,KAAAA,CAAMC,OAAO,CAAC,IAAA;AACrC,QAAA,MAAM,CAAC,EAAEyC,UAAAA,EAAY,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAG;AAAEA,YAAAA,MAAAA,EAAQ;AAAG,SAAC,EAAE,CAAC,GAAGtD,cAAAA,CAAea,MAAM,CAC9E,CAACC,UAAAA,GACCA,UAAAA,CAAWC,MAAM,KAAK,uCAAA,IACtBD,UAAAA,CAAWE,OAAO,KAAKvB,KAAAA,CAAAA;AAG3B,QAAA,MAAM8D,aAAAA,GAAgBD,MAAAA,CAAOzC,MAAM,CAAC,CAAC2C,KAAAA,GAAAA;AACnC,YAAA,MAAM1B,SAAAA,GAAYvC,UAAU,CAACiE,KAAAA,CAAM,IAAI,EAAC;YAExC,OAAO1B,SAAAA,CAAUE,IAAI,IAAI,CAAClD,oBAAoBoD,QAAQ,CAACJ,UAAUE,IAAI,CAAA;AACvE,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMyB,WAAAA,GAAc;AAClB,YAAA,IAAA;AACA,YAAA,YAAA;AACGF,YAAAA,GAAAA,aAAAA;AACAxE,YAAAA,GAAAA,uBAAAA;AACC2B,YAAAA,GAAAA,iBAAAA,GAAoBzB,iBAAiB,EAAE;AACvCS,YAAAA,GAAAA,OAAAA,EAASgE,oBAAoB,IAAA,GAAO;AAAC,gBAAA;AAAW,aAAA,GAAG;SACxD,CACEC,GAAG,CAAC,CAACC,IAAAA,GAAAA;AACJ,YAAA,IAAIA,SAAS,UAAA,EAAY;gBACvB,OAAO;oBACLA,IAAAA,EAAM,UAAA;oBACN5B,IAAAA,EAAM,aAAA;AACN6B,oBAAAA,KAAAA,EAAOlE,aAAAA,CAAc;AACnBgC,wBAAAA,EAAAA,EAAImC,cAAAA,CAAe,gCAAA,CAAA;wBACnBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAC,SAAAA,EAAW;AACT,wBAAA;AACEH,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJoC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT;AACD,qBAAA;oBACD9B,OAAAA,EAAS;AACP,wBAAA;AACEmE,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAImC,cAAAA,CAAe,oCAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEqC,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAImC,cAAAA,CAAe,wCAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEqC,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAImC,cAAAA,CAAe,gDAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEqC,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAImC,cAAAA,CAAe,kDAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT;AACD;AACH,iBAAA;AACF,YAAA;YAEA,MAAMM,SAAAA,GAAYvC,UAAU,CAACqE,IAAAA,CAAK;AAElC,YAAA,IAAI9E,mBAAAA,CAAoBoD,QAAQ,CAACJ,SAAAA,CAAUE,IAAI,CAAA,EAAG;gBAChD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAM,EAAEiC,SAAAA,EAAWC,aAAAA,GAAgB,EAAE,EAAEL,KAAK,EAAE,GAAGjB,QAAQ,CAACgB,IAAAA,CAAK,CAACO,IAAI;AAEpE,YAAA,IAAItD,MAAAA,GAAyB;AAC3B+C,gBAAAA,IAAAA;AACAC,gBAAAA,KAAAA,EAAOA,KAAAA,IAAS,EAAA;gBAChBI,SAAAA,EAAWG,YAAAA,CAAatC,WAAWoC,aAAAA,EAAe;AAAE5D,oBAAAA,OAAAA;AAAS+D,oBAAAA,UAAAA,EAAY;AAAG,iBAAA,CAAA;AAC5ErC,gBAAAA,IAAAA,EAAMF,UAAUE;AAClB,aAAA;YAEA,IACEF,SAAAA,CAAUE,IAAI,KAAK,UAAA,IACnB,YAAYF,SAAAA,IACZA,SAAAA,CAAUG,MAAM,KAAK,aAAA,EACrB;gBACApB,MAAAA,GAAS;AACP,oBAAA,GAAGA,MAAM;oBACTyD,KAAAA,EAAOC,gBAAAA;AACP7E,oBAAAA,OAAAA,EAASiD,KAAAA,CAAMgB,GAAG,CAAC,CAACa,QAAU;AAC5BX,4BAAAA,KAAAA,EAAOY,cAAAA,CAAeD,IAAAA,CAAAA;4BACtBhD,KAAAA,EAAOgD,IAAAA,CAAK7C,EAAE,CAAC+C,QAAQ;yBACzB,CAAA,CAAA;oBACAV,SAAAA,EAAW;AACT,wBAAA;AACEH,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJoC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEqC,4BAAAA,KAAAA,EAAOlE,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJoC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAvC,KAAAA,EAAO;AACT;AACD,qBAAA;oBACDyC,SAAAA,EAAW;wBACTL,IAAAA,EAAM,IAAA;wBACN5B,IAAAA,EAAM;AACR;AACF,iBAAA;AACF,YAAA;YAEA,IAAIF,SAAAA,CAAUE,IAAI,KAAK,aAAA,EAAe;gBACpCnB,MAAAA,GAAS;AACP,oBAAA,GAAGA,MAAM;AACTnB,oBAAAA,OAAAA,EAASoC,UAAU6C,IAAI,CAAChB,GAAG,CAAC,CAACnC,SAAW;4BACtCqC,KAAAA,EAAOrC,KAAAA;AACPA,4BAAAA;yBACF,CAAA;AACF,iBAAA;AACF,YAAA;YAEA,OAAOX,MAAAA;AACT,QAAA,CAAA,CAAA,CACCA,MAAM,CAAC+D,OAAAA,CAAAA;;;;AAKV,QAAA,MAAM,EAAExB,gBAAAA,EAAkByB,eAAe,EAAE,GAAGrE,iBAAiB5B,wBAAAA,EAA0B;YACvFwE,gBAAAA,EAAkBK,WAAAA;AAClBpE,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,MAAMyF,eAAe,CAACjB,KAAAA,GACpB,OAAOA,KAAAA,KAAU,QAAA,GAAWA,QAAQlE,aAAAA,CAAckE,KAAAA,CAAAA;AAEpD,QAAA,MAAMkB,cAAcpC,KAAAA,CAAMgB,GAAG,CAAC,CAACa,QAAU;AACvCX,gBAAAA,KAAAA,EAAOY,cAAAA,CAAeD,IAAAA,CAAAA;gBACtBhD,KAAAA,EAAOgD,IAAAA,CAAK7C,EAAE,CAAC+C,QAAQ;aACzB,CAAA,CAAA;AAEA,QAAA,MAAMM,SAAAA,GAAYH,eAAAA,CAAgBlB,GAAG,CAAiB,CAAC9C,MAAAA,GAAAA;AACrD,YAAA,MAAMoE,IAAAA,GAAuB;AAC3B,gBAAA,GAAGpE,MAAM;gBACTgD,KAAAA,EAAOiB,YAAAA,CAAajE,OAAOgD,KAAK,CAAA;AAChCG,gBAAAA,SAAAA,EAAWnD,OAAOmD,SAAS,EAAEL,GAAAA,CAAI,CAACuB,MAAQ;AAAE,wBAAA,GAAGA,EAAE;wBAAErB,KAAAA,EAAOiB,YAAAA,CAAaI,GAAGrB,KAAK;qBAAE,CAAA;AACnF,aAAA;;YAGA,IAAI7E,sBAAAA,CAAuBkD,QAAQ,CAACrB,MAAAA,CAAO+C,IAAI,KAAK,CAACqB,IAAAA,CAAKvF,OAAO,EAAEuB,MAAAA,EAAQ;AACzEgE,gBAAAA,IAAAA,CAAKvF,OAAO,GAAGqF,WAAAA;AACjB,YAAA;YAEA,OAAOE,IAAAA;AACT,QAAA,CAAA,CAAA;AAEA,QAAA,OAAOD,SAAAA,CAAUG,QAAQ,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAMpC,SAAAA,CAAUqC,OAAO,CAACF,CAAAA,CAAEvB,KAAK,EAAEwB,EAAExB,KAAK,CAAA,CAAA;IACxE,CAAA,EAAG;AACD7D,QAAAA,cAAAA;AACAU,QAAAA,iBAAAA;AACAjB,QAAAA,KAAAA;AACAF,QAAAA,UAAAA;AACAqD,QAAAA,QAAAA;AACAtC,QAAAA,OAAAA;AACAjB,QAAAA,MAAAA;AACAsD,QAAAA,KAAAA;AACAhD,QAAAA,aAAAA;AACAsD,QAAAA,SAAAA;QACAvD,OAAAA,EAASgE,eAAAA;AACTlD,QAAAA;AACD,KAAA,CAAA;AAED,IAAA,MAAM+E,eAAe,CAACC,MAAAA,GAAAA;AACpB,QAAA,IAAIA,MAAAA,EAAQ;YACV1F,UAAAA,CAAW,mBAAA,CAAA;AACb,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAM2F,qBAAgD,CAACrD,IAAAA,GAAAA;AACrD,QAAA,MAAMN,SAAAA,GAAYvC,UAAU,CAAC6C,IAAAA,CAAKwB,IAAI,CAAC;AAEvC,QAAA,IAAI9B,SAAAA,EAAW;AACbhC,YAAAA,UAAAA,CAAW,kBAAA,EAAoB;gBAC7B4F,WAAAA,EAAa5D,SAAAA,CAAUE,IAAI,KAAK;AAClC,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACE2D,GAAA,CAACC,QAAQ1G,IAAI,EAAA;QACXC,QAAAA,EAAUA,QAAAA;QACVO,OAAAA,EAAS0D,gBAAAA;QACTmC,YAAAA,EAAcA,YAAAA;QACdM,QAAAA,EAAUJ,kBAAAA;AAETnG,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;AAEA;;AAEkG,qGAElG,MAAMiF,gBAAAA,GAAmB,CAAC,EAAEX,IAAI,EAA2B,GAAA;AACzD,IAAA,MAAM,CAACkC,QAAAA,EAAUC,WAAAA,CAAY,GAAGpF,KAAAA,CAAMqF,QAAQ,CAAC,EAAA,CAAA;AAC/C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGvF,KAAAA,CAAMqF,QAAQ,CAAC,EAAA,CAAA;IAC3C,MAAM,EAAErG,aAAa,EAAE,GAAGE,OAAAA,EAAAA;IAE1B,MAAMsG,eAAAA,GAAkBC,YAAYH,MAAAA,EAAQ,GAAA,CAAA;AAE5C,IAAA,MAAM,EAAE7D,IAAI,EAAEE,SAAS,EAAE,GAAGE,aAAAA,CAAc;AACxCsD,QAAAA,QAAAA;QACAO,EAAAA,EAAIF;AACN,KAAA,CAAA;AACA,IAAA,MAAM3C,QAAQ8C,QAAAA,CAAS1C,IAAAA,CAAAA;AAEvB,IAAA,MAAM2C,mBAAmB,CAACf,MAAAA,GAAAA;AACxB,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXO,WAAAA,CAAY,EAAA,CAAA;AACd,QAAA;AACF,IAAA,CAAA;IAEA,MAAM,EAAEpD,QAAQ,EAAE,EAAE6D,UAAU,EAAE,GAAGpE,QAAQ,EAAC;IAC5C,MAAM,EAAEqE,YAAY,CAAC,EAAEC,OAAO,CAAC,EAAE,GAAGF,UAAAA,IAAc,EAAC;AAEnD,IAAA,qBACEb,GAAA,CAACgB,QAAAA,EAAAA;AACCnF,QAAAA,KAAAA,EAAOgC,MAAMhC,KAAK;AAClBoF,QAAAA,YAAAA,EAAYjH,aAAAA,CAAc;YACxBgC,EAAAA,EAAI,sDAAA;YACJoC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAwB,YAAAA,EAAcgB,gBAAAA;AACdV,QAAAA,QAAAA,EAAU,CAACrE,KAAAA,GAAUgC,KAAAA,CAAMqC,QAAQ,CAACjC,IAAAA,EAAMpC,KAAAA,CAAAA;QAC1CqF,OAAAA,EAASvE,SAAAA;QACTwE,UAAAA,EAAY,IAAMf,YAAYD,QAAAA,GAAW,EAAA,CAAA;AACzCiB,QAAAA,YAAAA,EAAcL,IAAAA,GAAOD,SAAAA;AACrBO,QAAAA,aAAAA,EAAe,CAACC,CAAAA,GAAAA;YACdf,SAAAA,CAAUe,CAAAA,CAAEC,aAAa,CAAC1F,KAAK,CAAA;AACjC,QAAA,CAAA;kBAECmB,KAAAA,CAAMgB,GAAG,CAAC,CAACa,IAAAA,GAAAA;AACV,YAAA,qBACEmB,GAAA,CAACwB,cAAAA,EAAAA;gBAA6B3F,KAAAA,EAAOgD,IAAAA,CAAK7C,EAAE,CAAC+C,QAAQ,EAAA;0BAClDD,cAAAA,CAAeD,IAAAA;AADGA,aAAAA,EAAAA,IAAAA,CAAK7C,EAAE,CAAA;AAIhC,QAAA,CAAA;;AAGN,CAAA;AAEA,MAAMyF,eAAAA,GAAkB;AACtBlI,IAAAA,IAAAA;AACAmI,IAAAA,OAAAA,EAASzB,QAAQyB,OAAO;AACxBC,IAAAA,OAAAA,EAAS1B,QAAQ0B,OAAO;AACxBC,IAAAA,IAAAA,EAAM3B,QAAQ2B;AAChB;;;;"}
|
|
1
|
+
{"version":3,"file":"Filters.mjs","sources":["../../../../../admin/src/pages/ListView/components/Filters.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n Filters,\n useField,\n useAuth,\n useTracking,\n useQueryParams,\n useAdminUsers,\n useStrapiApp,\n} from '@strapi/admin/strapi-admin';\nimport { Combobox, ComboboxOption, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { CREATOR_FIELDS } from '../../../constants/attributes';\nimport { HOOKS } from '../../../constants/hooks';\nimport { useContentTypeSchema } from '../../../hooks/useContentTypeSchema';\nimport { useDebounce } from '../../../hooks/useDebounce';\nimport { Schema } from '../../../hooks/useDocument';\nimport { getMainField } from '../../../utils/attributes';\nimport { getTranslation } from '../../../utils/translations';\nimport { getDisplayName } from '../../../utils/users';\n\nimport type { InjectableListViewFilter } from '../../../constants/hooks';\nimport type { ListLayout } from '../../../hooks/useDocumentLayout';\n\nconst { INJECT_LIST_VIEW_FILTERS } = HOOKS;\n\n/**\n * If new attributes are added, this list needs to be updated.\n */\nconst NOT_ALLOWED_FILTERS = [\n 'json',\n 'component',\n 'media',\n 'richtext',\n 'dynamiczone',\n 'password',\n 'blocks',\n];\nconst DEFAULT_ALLOWED_FILTERS = ['createdAt', 'updatedAt'];\nconst USER_FILTER_ATTRIBUTES = [...CREATOR_FIELDS, 'strapi_assignee'];\n\n/* -------------------------------------------------------------------------------------------------\n * Filters\n * -----------------------------------------------------------------------------------------------*/\ninterface FiltersProps {\n disabled?: boolean;\n schema: Schema;\n layout: ListLayout;\n children: React.ReactNode;\n}\n\nconst Root = ({ disabled, schema, layout, children }: FiltersProps) => {\n const { attributes, uid: model, options } = schema;\n const { formatMessage, locale } = useIntl();\n const { trackUsage } = useTracking();\n const allPermissions = useAuth('FiltersImpl', (state) => state.permissions);\n const [{ query }] = useQueryParams<Filters.Query>();\n const { schemas } = useContentTypeSchema();\n const runHookWaterfall = useStrapiApp('FiltersImpl', ({ runHookWaterfall }) => runHookWaterfall);\n\n const canReadAdminUsers = React.useMemo(\n () =>\n allPermissions.filter(\n (permission) => permission.action === 'admin::users.read' && permission.subject === null\n ).length > 0,\n [allPermissions]\n );\n\n const selectedUserIds = (query?.filters?.$and ?? []).reduce<string[]>((acc, filter) => {\n const [key, value] = Object.entries(filter)[0];\n if (typeof value.id !== 'object') {\n return acc;\n }\n\n const id = value.id.$eq || value.id.$ne;\n\n // Check if the attribute is a relation to admin::user\n const attribute = attributes[key];\n const isAdminUserRelation =\n attribute?.type === 'relation' && 'target' in attribute && attribute.target === 'admin::user';\n\n if (id && (isAdminUserRelation || USER_FILTER_ATTRIBUTES.includes(key)) && !acc.includes(id)) {\n acc.push(id);\n }\n\n return acc;\n }, []);\n\n const { data: userData, isLoading: isLoadingAdminUsers } = useAdminUsers(\n { filters: { id: { $in: selectedUserIds } } },\n {\n // fetch the list of admin users only if the filter contains users and the\n // current user has permissions to display users\n skip: selectedUserIds.length === 0 || !canReadAdminUsers,\n }\n );\n\n const { users = [] } = userData ?? {};\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const displayedFilters = React.useMemo(() => {\n const [{ properties: { fields = [] } = { fields: [] } }] = allPermissions.filter(\n (permission) =>\n permission.action === 'plugin::content-manager.explorer.read' &&\n permission.subject === model\n );\n\n const allowedFields = fields.filter((field) => {\n const attribute = attributes[field] ?? {};\n\n return attribute.type && !NOT_ALLOWED_FILTERS.includes(attribute.type);\n });\n\n const baseFilters = [\n 'id',\n 'documentId',\n ...allowedFields,\n ...DEFAULT_ALLOWED_FILTERS,\n ...(canReadAdminUsers ? CREATOR_FIELDS : []),\n ...(options?.draftAndPublish === true ? ['__status'] : []),\n ]\n .map((name) => {\n if (name === '__status') {\n return {\n name: '__status',\n type: 'enumeration',\n label: formatMessage({\n id: getTranslation('containers.list.filters.status'),\n defaultMessage: 'Status',\n }),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n ],\n options: [\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.draft'),\n defaultMessage: 'Draft (never published)',\n }),\n value: 'draft',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.published'),\n defaultMessage: 'Published (all)',\n }),\n value: 'published',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedModified'),\n defaultMessage: 'Published (modified)',\n }),\n value: 'published-modified',\n },\n {\n label: formatMessage({\n id: getTranslation('containers.List.statusFilter.publishedUnmodified'),\n defaultMessage: 'Published (unmodified)',\n }),\n value: 'published-unmodified',\n },\n ],\n } satisfies Filters.Filter;\n }\n\n const attribute = attributes[name];\n\n if (!attribute || NOT_ALLOWED_FILTERS.includes(attribute.type)) {\n return null;\n }\n\n const fieldMetadata = layout.metadatas?.[name];\n if (!fieldMetadata) {\n return null;\n }\n\n const { mainField: mainFieldName = '', label } = fieldMetadata;\n\n let filter: Filters.Filter = {\n name,\n label: label ?? '',\n mainField: getMainField(attribute, mainFieldName, { schemas, components: {} }),\n type: attribute.type as Filters.Filter['type'],\n };\n\n if (\n attribute.type === 'relation' &&\n 'target' in attribute &&\n attribute.target === 'admin::user'\n ) {\n filter = {\n ...filter,\n input: AdminUsersFilter,\n options: users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n })),\n operators: [\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$eq',\n defaultMessage: 'is',\n }),\n value: '$eq',\n },\n {\n label: formatMessage({\n id: 'components.FilterOptions.FILTER_TYPES.$ne',\n defaultMessage: 'is not',\n }),\n value: '$ne',\n },\n ],\n mainField: {\n name: 'id',\n type: 'integer',\n },\n };\n }\n\n if (attribute.type === 'enumeration') {\n filter = {\n ...filter,\n options: attribute.enum.map((value) => ({\n label: value,\n value,\n })),\n };\n }\n\n return filter;\n })\n .filter(Boolean) as Filters.Filter[];\n\n // Let plugins inject their own filters.\n // `layout.options` is a merge of schema/pluginOptions/contentType options —\n // mirrors the column-injection hook contract.\n const { displayedFilters: extendedFilters } = runHookWaterfall(INJECT_LIST_VIEW_FILTERS, {\n displayedFilters: baseFilters as InjectableListViewFilter[],\n layout,\n });\n\n const resolveLabel = (label: string | MessageDescriptor): string =>\n typeof label === 'string' ? label : formatMessage(label);\n\n const userOptions = users.map((user) => ({\n label: getDisplayName(user),\n value: user.id.toString(),\n }));\n\n const formatted = extendedFilters.map<Filters.Filter>((filter) => {\n const next: Filters.Filter = {\n ...filter,\n label: resolveLabel(filter.label),\n operators: filter.operators?.map((op) => ({ ...op, label: resolveLabel(op.label) })),\n };\n\n // User-typed filters need user options so the chip can render the display name instead of the id.\n if (USER_FILTER_ATTRIBUTES.includes(filter.name) && !next.options?.length) {\n next.options = userOptions;\n }\n\n return next;\n });\n\n return formatted.toSorted((a, b) => formatter.compare(a.label, b.label));\n }, [\n allPermissions,\n canReadAdminUsers,\n model,\n attributes,\n layout.metadatas,\n schemas,\n layout,\n users,\n formatMessage,\n formatter,\n options?.draftAndPublish,\n runHookWaterfall,\n ]);\n\n const onOpenChange = (isOpen: boolean) => {\n if (isOpen) {\n trackUsage('willFilterEntries');\n }\n };\n\n const handleFilterChange: Filters.Props['onChange'] = (data) => {\n const attribute = attributes[data.name];\n\n if (attribute) {\n trackUsage('didFilterEntries', {\n useRelation: attribute.type === 'relation',\n });\n }\n };\n\n return (\n <Filters.Root\n disabled={disabled}\n options={displayedFilters}\n onOpenChange={onOpenChange}\n onChange={handleFilterChange}\n >\n {children}\n </Filters.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * AdminUsersFilter\n * -----------------------------------------------------------------------------------------------*/\n\nconst AdminUsersFilter = ({ name }: Filters.ValueInputProps) => {\n const [pageSize, setPageSize] = React.useState(10);\n const [search, setSearch] = React.useState('');\n const { formatMessage } = useIntl();\n\n const debouncedSearch = useDebounce(search, 300);\n\n const { data, isLoading } = useAdminUsers({\n pageSize,\n _q: debouncedSearch,\n });\n const field = useField(name);\n\n const handleOpenChange = (isOpen?: boolean) => {\n if (!isOpen) {\n setPageSize(10);\n }\n };\n\n const { users = [], pagination } = data ?? {};\n const { pageCount = 1, page = 1 } = pagination ?? {};\n\n return (\n <Combobox\n value={field.value}\n aria-label={formatMessage({\n id: 'content-manager.components.Filters.usersSelect.label',\n defaultMessage: 'Search and select a user to filter',\n })}\n onOpenChange={handleOpenChange}\n onChange={(value) => field.onChange(name, value)}\n loading={isLoading}\n onLoadMore={() => setPageSize(pageSize + 10)}\n hasMoreItems={page < pageCount}\n onInputChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n setSearch(e.currentTarget.value);\n }}\n >\n {users.map((user) => {\n return (\n <ComboboxOption key={user.id} value={user.id.toString()}>\n {getDisplayName(user)}\n </ComboboxOption>\n );\n })}\n </Combobox>\n );\n};\n\nconst listViewFilters = {\n Root,\n Trigger: Filters.Trigger,\n Popover: Filters.Popover,\n List: Filters.List,\n};\n\nexport { listViewFilters };\nexport type { FiltersProps };\n"],"names":["INJECT_LIST_VIEW_FILTERS","HOOKS","NOT_ALLOWED_FILTERS","DEFAULT_ALLOWED_FILTERS","USER_FILTER_ATTRIBUTES","CREATOR_FIELDS","Root","disabled","schema","layout","children","attributes","uid","model","options","formatMessage","locale","useIntl","trackUsage","useTracking","allPermissions","useAuth","state","permissions","query","useQueryParams","schemas","useContentTypeSchema","runHookWaterfall","useStrapiApp","canReadAdminUsers","React","useMemo","filter","permission","action","subject","length","selectedUserIds","filters","$and","reduce","acc","key","value","Object","entries","id","$eq","$ne","attribute","isAdminUserRelation","type","target","includes","push","data","userData","isLoading","isLoadingAdminUsers","useAdminUsers","$in","skip","users","formatter","useCollator","sensitivity","displayedFilters","properties","fields","allowedFields","field","baseFilters","draftAndPublish","map","name","label","getTranslation","defaultMessage","operators","fieldMetadata","metadatas","mainField","mainFieldName","getMainField","components","input","AdminUsersFilter","user","getDisplayName","toString","enum","Boolean","extendedFilters","resolveLabel","userOptions","formatted","next","op","toSorted","a","b","compare","onOpenChange","isOpen","handleFilterChange","useRelation","_jsx","Filters","onChange","pageSize","setPageSize","useState","search","setSearch","debouncedSearch","useDebounce","_q","useField","handleOpenChange","pagination","pageCount","page","Combobox","aria-label","loading","onLoadMore","hasMoreItems","onInputChange","e","currentTarget","ComboboxOption","listViewFilters","Trigger","Popover","List"],"mappings":"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"}
|
|
@@ -9,18 +9,19 @@ var urls = require('../../../../utils/urls.js');
|
|
|
9
9
|
const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
|
|
10
10
|
const MediaSingle = ({ url, mime, alternativeText, name, ext, formats })=>{
|
|
11
11
|
const fileURL = urls.prefixFileUrlWithBackendUrl(url);
|
|
12
|
-
if (mime
|
|
12
|
+
if (mime?.includes('image')) {
|
|
13
13
|
const thumbnail = formats?.thumbnail?.url;
|
|
14
14
|
const mediaURL = urls.prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
|
|
15
|
+
const mediaLabel = alternativeText || name || undefined;
|
|
15
16
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Avatar.Item, {
|
|
16
17
|
src: mediaURL,
|
|
17
|
-
alt:
|
|
18
|
-
fallback:
|
|
18
|
+
alt: mediaLabel,
|
|
19
|
+
fallback: mediaLabel,
|
|
19
20
|
preview: true
|
|
20
21
|
});
|
|
21
22
|
}
|
|
22
23
|
const fileExtension = getFileExtension(ext);
|
|
23
|
-
const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
|
|
24
|
+
const fileName = name && name.length > 100 ? `${name.substring(0, 100)}...` : name;
|
|
24
25
|
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
|
|
25
26
|
label: fileName,
|
|
26
27
|
children: /*#__PURE__*/ jsxRuntime.jsx("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Media.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Media.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Avatar, Flex, Tooltip, Typography, TypographyComponent } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/urls';\n\nimport type { Data } from '@strapi/types';\n\ninterface MediaFile {\n id?: Data.ID;\n alternativeText?: string;\n ext: string;\n formats: {\n thumbnail?: {\n url?: string;\n };\n };\n mime
|
|
1
|
+
{"version":3,"file":"Media.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Media.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Avatar, Flex, Tooltip, Typography, TypographyComponent } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/urls';\n\nimport type { Data } from '@strapi/types';\n\ninterface MediaFile {\n id?: Data.ID;\n alternativeText?: string;\n ext: string;\n formats: {\n thumbnail?: {\n url?: string;\n };\n };\n mime?: string | null;\n name?: string | null;\n url: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Media\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaSingleProps extends MediaFile {}\n\nconst getFileExtension = (ext: string) => (ext && ext[0] === '.' ? ext.substring(1) : ext);\n\nconst MediaSingle = ({ url, mime, alternativeText, name, ext, formats }: MediaSingleProps) => {\n const fileURL = prefixFileUrlWithBackendUrl(url)!;\n\n if (mime?.includes('image')) {\n const thumbnail = formats?.thumbnail?.url;\n const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;\n const mediaLabel = alternativeText || name || undefined;\n\n return <Avatar.Item src={mediaURL} alt={mediaLabel} fallback={mediaLabel} preview />;\n }\n\n const fileExtension = getFileExtension(ext);\n const fileName = name && name.length > 100 ? `${name.substring(0, 100)}...` : name;\n\n return (\n <Tooltip label={fileName}>\n <span>\n <FileWrapper>{fileExtension}</FileWrapper>\n </span>\n </Tooltip>\n );\n};\n\nconst FileWrapper = ({ children }: { children: React.ReactNode }) => {\n return (\n <Flex\n tag=\"span\"\n position=\"relative\"\n borderRadius=\"50%\"\n width=\"26px\"\n height=\"26px\"\n borderColor=\"neutral200\"\n background=\"neutral150\"\n paddingLeft=\"1px\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <FileTypography variant=\"sigma\" textColor=\"neutral600\">\n {children}\n </FileTypography>\n </Flex>\n );\n};\n\nconst FileTypography = styled<TypographyComponent>(Typography)`\n font-size: 0.9rem;\n line-height: 0.9rem;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * MediaMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaMultipleProps {\n content: MediaFile[];\n}\n\nconst MediaMultiple = ({ content }: MediaMultipleProps) => {\n return (\n <Avatar.Group>\n {content.map((file, index) => {\n const key = `${file.id}${index}`;\n\n if (index === 3) {\n const remainingFiles = `+${content.length - 3}`;\n\n return <FileWrapper key={key}>{remainingFiles}</FileWrapper>;\n }\n\n if (index > 3) {\n return null;\n }\n\n return <MediaSingle key={key} {...file} />;\n })}\n </Avatar.Group>\n );\n};\n\nexport { MediaMultiple, MediaSingle };\nexport type { MediaMultipleProps, MediaSingleProps };\n"],"names":["getFileExtension","ext","substring","MediaSingle","url","mime","alternativeText","name","formats","fileURL","prefixFileUrlWithBackendUrl","includes","thumbnail","mediaURL","mediaLabel","undefined","_jsx","Avatar","Item","src","alt","fallback","preview","fileExtension","fileName","length","Tooltip","label","span","FileWrapper","children","Flex","tag","position","borderRadius","width","height","borderColor","background","paddingLeft","justifyContent","alignItems","FileTypography","variant","textColor","styled","Typography","MediaMultiple","content","Group","map","file","index","key","id","remainingFiles"],"mappings":"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"}
|
|
@@ -7,18 +7,19 @@ import { prefixFileUrlWithBackendUrl } from '../../../../utils/urls.mjs';
|
|
|
7
7
|
const getFileExtension = (ext)=>ext && ext[0] === '.' ? ext.substring(1) : ext;
|
|
8
8
|
const MediaSingle = ({ url, mime, alternativeText, name, ext, formats })=>{
|
|
9
9
|
const fileURL = prefixFileUrlWithBackendUrl(url);
|
|
10
|
-
if (mime
|
|
10
|
+
if (mime?.includes('image')) {
|
|
11
11
|
const thumbnail = formats?.thumbnail?.url;
|
|
12
12
|
const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;
|
|
13
|
+
const mediaLabel = alternativeText || name || undefined;
|
|
13
14
|
return /*#__PURE__*/ jsx(Avatar.Item, {
|
|
14
15
|
src: mediaURL,
|
|
15
|
-
alt:
|
|
16
|
-
fallback:
|
|
16
|
+
alt: mediaLabel,
|
|
17
|
+
fallback: mediaLabel,
|
|
17
18
|
preview: true
|
|
18
19
|
});
|
|
19
20
|
}
|
|
20
21
|
const fileExtension = getFileExtension(ext);
|
|
21
|
-
const fileName = name.length > 100 ? `${name.substring(0, 100)}...` : name;
|
|
22
|
+
const fileName = name && name.length > 100 ? `${name.substring(0, 100)}...` : name;
|
|
22
23
|
return /*#__PURE__*/ jsx(Tooltip, {
|
|
23
24
|
label: fileName,
|
|
24
25
|
children: /*#__PURE__*/ jsx("span", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Media.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Media.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Avatar, Flex, Tooltip, Typography, TypographyComponent } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/urls';\n\nimport type { Data } from '@strapi/types';\n\ninterface MediaFile {\n id?: Data.ID;\n alternativeText?: string;\n ext: string;\n formats: {\n thumbnail?: {\n url?: string;\n };\n };\n mime
|
|
1
|
+
{"version":3,"file":"Media.mjs","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/Media.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Avatar, Flex, Tooltip, Typography, TypographyComponent } from '@strapi/design-system';\nimport { styled } from 'styled-components';\n\nimport { prefixFileUrlWithBackendUrl } from '../../../../utils/urls';\n\nimport type { Data } from '@strapi/types';\n\ninterface MediaFile {\n id?: Data.ID;\n alternativeText?: string;\n ext: string;\n formats: {\n thumbnail?: {\n url?: string;\n };\n };\n mime?: string | null;\n name?: string | null;\n url: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Media\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaSingleProps extends MediaFile {}\n\nconst getFileExtension = (ext: string) => (ext && ext[0] === '.' ? ext.substring(1) : ext);\n\nconst MediaSingle = ({ url, mime, alternativeText, name, ext, formats }: MediaSingleProps) => {\n const fileURL = prefixFileUrlWithBackendUrl(url)!;\n\n if (mime?.includes('image')) {\n const thumbnail = formats?.thumbnail?.url;\n const mediaURL = prefixFileUrlWithBackendUrl(thumbnail) || fileURL;\n const mediaLabel = alternativeText || name || undefined;\n\n return <Avatar.Item src={mediaURL} alt={mediaLabel} fallback={mediaLabel} preview />;\n }\n\n const fileExtension = getFileExtension(ext);\n const fileName = name && name.length > 100 ? `${name.substring(0, 100)}...` : name;\n\n return (\n <Tooltip label={fileName}>\n <span>\n <FileWrapper>{fileExtension}</FileWrapper>\n </span>\n </Tooltip>\n );\n};\n\nconst FileWrapper = ({ children }: { children: React.ReactNode }) => {\n return (\n <Flex\n tag=\"span\"\n position=\"relative\"\n borderRadius=\"50%\"\n width=\"26px\"\n height=\"26px\"\n borderColor=\"neutral200\"\n background=\"neutral150\"\n paddingLeft=\"1px\"\n justifyContent=\"center\"\n alignItems=\"center\"\n >\n <FileTypography variant=\"sigma\" textColor=\"neutral600\">\n {children}\n </FileTypography>\n </Flex>\n );\n};\n\nconst FileTypography = styled<TypographyComponent>(Typography)`\n font-size: 0.9rem;\n line-height: 0.9rem;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * MediaMultiple\n * -----------------------------------------------------------------------------------------------*/\n\ninterface MediaMultipleProps {\n content: MediaFile[];\n}\n\nconst MediaMultiple = ({ content }: MediaMultipleProps) => {\n return (\n <Avatar.Group>\n {content.map((file, index) => {\n const key = `${file.id}${index}`;\n\n if (index === 3) {\n const remainingFiles = `+${content.length - 3}`;\n\n return <FileWrapper key={key}>{remainingFiles}</FileWrapper>;\n }\n\n if (index > 3) {\n return null;\n }\n\n return <MediaSingle key={key} {...file} />;\n })}\n </Avatar.Group>\n );\n};\n\nexport { MediaMultiple, MediaSingle };\nexport type { MediaMultipleProps, MediaSingleProps };\n"],"names":["getFileExtension","ext","substring","MediaSingle","url","mime","alternativeText","name","formats","fileURL","prefixFileUrlWithBackendUrl","includes","thumbnail","mediaURL","mediaLabel","undefined","_jsx","Avatar","Item","src","alt","fallback","preview","fileExtension","fileName","length","Tooltip","label","span","FileWrapper","children","Flex","tag","position","borderRadius","width","height","borderColor","background","paddingLeft","justifyContent","alignItems","FileTypography","variant","textColor","styled","Typography","MediaMultiple","content","Group","map","file","index","key","id","remainingFiles"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var useDocumentLayout = require('../hooks/useDocumentLayout.js');
|
|
4
|
+
var normalizeContentManagerLayout = require('../utils/layouts/normalizeContentManagerLayout.js');
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* Formats API configuration + schemas into the shape expected by the component
|
|
@@ -8,21 +9,26 @@ var useDocumentLayout = require('../hooks/useDocumentLayout.js');
|
|
|
8
9
|
* `convertEditLayoutToFieldLayouts` calls must receive component configuration
|
|
9
10
|
* and full component schemas so `getMainField` can resolve fields inside nested
|
|
10
11
|
* component attributes (see #25509).
|
|
11
|
-
*/ const formatComponentConfigurationEditLayout = (data, { schema, components })=>{
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
*/ const formatComponentConfigurationEditLayout = (data, { schema, components, schemas = [] })=>{
|
|
13
|
+
const normalizedData = normalizeContentManagerLayout.normalizeComponentConfigurationLayout(data, {
|
|
14
|
+
schema,
|
|
15
|
+
components,
|
|
16
|
+
schemas
|
|
15
17
|
});
|
|
16
|
-
const
|
|
18
|
+
const editAttributes = useDocumentLayout.convertEditLayoutToFieldLayouts(normalizedData.component.layouts.edit, schema?.attributes, normalizedData.component.metadatas, {
|
|
19
|
+
configurations: normalizedData.components,
|
|
20
|
+
schemas: components
|
|
21
|
+
}, schemas);
|
|
22
|
+
const componentEditAttributes = Object.entries(normalizedData.components).reduce((acc, [uid, configuration])=>{
|
|
17
23
|
const componentSchema = components[uid];
|
|
18
24
|
if (!componentSchema) {
|
|
19
25
|
return acc;
|
|
20
26
|
}
|
|
21
27
|
acc[uid] = {
|
|
22
28
|
layout: useDocumentLayout.convertEditLayoutToFieldLayouts(configuration.layouts.edit, componentSchema.attributes, configuration.metadatas, {
|
|
23
|
-
configurations:
|
|
29
|
+
configurations: normalizedData.components,
|
|
24
30
|
schemas: components
|
|
25
|
-
}),
|
|
31
|
+
}, schemas),
|
|
26
32
|
settings: {
|
|
27
33
|
...configuration.settings,
|
|
28
34
|
icon: componentSchema.info.icon,
|
|
@@ -31,7 +37,7 @@ var useDocumentLayout = require('../hooks/useDocumentLayout.js');
|
|
|
31
37
|
};
|
|
32
38
|
return acc;
|
|
33
39
|
}, {});
|
|
34
|
-
const editMetadatas = Object.entries(
|
|
40
|
+
const editMetadatas = Object.entries(normalizedData.component.metadatas).reduce((acc, [attribute, metadata])=>{
|
|
35
41
|
return {
|
|
36
42
|
...acc,
|
|
37
43
|
[attribute]: metadata.edit
|
|
@@ -48,7 +54,7 @@ var useDocumentLayout = require('../hooks/useDocumentLayout.js');
|
|
|
48
54
|
...schema?.pluginOptions
|
|
49
55
|
},
|
|
50
56
|
settings: {
|
|
51
|
-
...
|
|
57
|
+
...normalizedData.component.settings,
|
|
52
58
|
displayName: schema?.info.displayName
|
|
53
59
|
}
|
|
54
60
|
};
|