@strapi/content-manager 5.50.0 → 5.50.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/admin/components/ComponentIcon.js.map +1 -1
  2. package/dist/admin/components/ComponentIcon.mjs.map +1 -1
  3. package/dist/admin/components/ConfigurationForm/Fields.js.map +1 -1
  4. package/dist/admin/components/ConfigurationForm/Fields.mjs.map +1 -1
  5. package/dist/admin/components/DragLayer.js.map +1 -1
  6. package/dist/admin/components/DragLayer.mjs.map +1 -1
  7. package/dist/admin/components/LeftMenu.js +66 -67
  8. package/dist/admin/components/LeftMenu.js.map +1 -1
  9. package/dist/admin/components/LeftMenu.mjs +68 -69
  10. package/dist/admin/components/LeftMenu.mjs.map +1 -1
  11. package/dist/admin/history/components/VersionInputRenderer.js +3 -3
  12. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  13. package/dist/admin/history/components/VersionInputRenderer.mjs +3 -3
  14. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  15. package/dist/admin/history/routes.js.map +1 -1
  16. package/dist/admin/history/routes.mjs.map +1 -1
  17. package/dist/admin/hooks/useDocumentActions.js +15 -8
  18. package/dist/admin/hooks/useDocumentActions.js.map +1 -1
  19. package/dist/admin/hooks/useDocumentActions.mjs +15 -8
  20. package/dist/admin/hooks/useDocumentActions.mjs.map +1 -1
  21. package/dist/admin/hooks/useDocumentContext.js.map +1 -1
  22. package/dist/admin/hooks/useDocumentContext.mjs.map +1 -1
  23. package/dist/admin/index.js.map +1 -1
  24. package/dist/admin/index.mjs.map +1 -1
  25. package/dist/admin/layout.js +18 -6
  26. package/dist/admin/layout.js.map +1 -1
  27. package/dist/admin/layout.mjs +18 -6
  28. package/dist/admin/layout.mjs.map +1 -1
  29. package/dist/admin/pages/ComponentConfigurationPage.js.map +1 -1
  30. package/dist/admin/pages/ComponentConfigurationPage.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/DocumentActions.js +7 -6
  32. package/dist/admin/pages/EditView/components/DocumentActions.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/DocumentActions.mjs +7 -6
  34. package/dist/admin/pages/EditView/components/DocumentActions.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +6 -3
  36. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +6 -3
  38. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js +1 -1
  40. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs +1 -1
  42. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksInput.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.js.map +1 -1
  44. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksToolbar.mjs.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.js.map +1 -1
  46. package/dist/admin/pages/EditView/components/FormInputs/Component/Initializer.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js +1 -1
  48. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs +1 -1
  50. package/dist/admin/pages/EditView/components/FormInputs/Component/Input.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +2 -1
  52. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +2 -1
  54. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  56. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +8 -5
  58. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  59. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +8 -5
  60. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  61. package/dist/admin/pages/EditView/components/FormInputs/UID.js +5 -4
  62. package/dist/admin/pages/EditView/components/FormInputs/UID.js.map +1 -1
  63. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs +5 -4
  64. package/dist/admin/pages/EditView/components/FormInputs/UID.mjs.map +1 -1
  65. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.js.map +1 -1
  66. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Editor.mjs.map +1 -1
  67. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js +2 -2
  68. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.js.map +1 -1
  69. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.mjs +2 -2
  70. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/Field.mjs.map +1 -1
  71. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.js.map +1 -1
  72. package/dist/admin/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.mjs.map +1 -1
  73. package/dist/admin/pages/EditView/components/Panels.js.map +1 -1
  74. package/dist/admin/pages/EditView/components/Panels.mjs.map +1 -1
  75. package/dist/admin/pages/EditView/utils/data.js.map +1 -1
  76. package/dist/admin/pages/EditView/utils/data.mjs.map +1 -1
  77. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  78. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  79. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.js.map +1 -1
  80. package/dist/admin/pages/ListConfiguration/components/SortDisplayedFields.mjs.map +1 -1
  81. package/dist/admin/pages/ListView/ListViewPage.js +71 -11
  82. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  83. package/dist/admin/pages/ListView/ListViewPage.mjs +73 -13
  84. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  85. package/dist/admin/pages/ListView/components/BulkActions/Actions.js +2 -1
  86. package/dist/admin/pages/ListView/components/BulkActions/Actions.js.map +1 -1
  87. package/dist/admin/pages/ListView/components/BulkActions/Actions.mjs +2 -1
  88. package/dist/admin/pages/ListView/components/BulkActions/Actions.mjs.map +1 -1
  89. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.js.map +1 -1
  90. package/dist/admin/pages/ListView/components/BulkActions/ConfirmBulkActionDialog.mjs.map +1 -1
  91. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.js.map +1 -1
  92. package/dist/admin/pages/ListView/components/BulkActions/PublishAction.mjs.map +1 -1
  93. package/dist/admin/pages/ListView/components/Filters.js +5 -3
  94. package/dist/admin/pages/ListView/components/Filters.js.map +1 -1
  95. package/dist/admin/pages/ListView/components/Filters.mjs +5 -3
  96. package/dist/admin/pages/ListView/components/Filters.mjs.map +1 -1
  97. package/dist/admin/pages/ListView/components/TableActions.js +37 -0
  98. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  99. package/dist/admin/pages/ListView/components/TableActions.mjs +39 -2
  100. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  101. package/dist/admin/pages/ListView/components/TableCells/CellContent.js +26 -1
  102. package/dist/admin/pages/ListView/components/TableCells/CellContent.js.map +1 -1
  103. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs +26 -2
  104. package/dist/admin/pages/ListView/components/TableCells/CellContent.mjs.map +1 -1
  105. package/dist/admin/pages/ListView/components/TableCells/CellValue.js +8 -7
  106. package/dist/admin/pages/ListView/components/TableCells/CellValue.js.map +1 -1
  107. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs +8 -7
  108. package/dist/admin/pages/ListView/components/TableCells/CellValue.mjs.map +1 -1
  109. package/dist/admin/pages/ListView/components/TableCells/Components.js.map +1 -1
  110. package/dist/admin/pages/ListView/components/TableCells/Components.mjs.map +1 -1
  111. package/dist/admin/preview/pages/Preview.js +2 -0
  112. package/dist/admin/preview/pages/Preview.js.map +1 -1
  113. package/dist/admin/preview/pages/Preview.mjs +2 -0
  114. package/dist/admin/preview/pages/Preview.mjs.map +1 -1
  115. package/dist/admin/preview/routes.js.map +1 -1
  116. package/dist/admin/preview/routes.mjs.map +1 -1
  117. package/dist/admin/preview/utils/fieldUtils.js.map +1 -1
  118. package/dist/admin/preview/utils/fieldUtils.mjs.map +1 -1
  119. package/dist/admin/router.js.map +1 -1
  120. package/dist/admin/router.mjs.map +1 -1
  121. package/dist/admin/services/documents.js.map +1 -1
  122. package/dist/admin/services/documents.mjs.map +1 -1
  123. package/dist/admin/src/components/ComponentIcon.d.ts +4 -3
  124. package/dist/admin/src/components/DragLayer.d.ts +1 -1
  125. package/dist/admin/src/history/routes.d.ts +2 -2
  126. package/dist/admin/src/history/services/historyVersion.d.ts +1 -1
  127. package/dist/admin/src/hooks/useDocumentActions.d.ts +17 -16
  128. package/dist/admin/src/hooks/useDocumentContext.d.ts +1 -1
  129. package/dist/admin/src/index.d.ts +1 -1
  130. package/dist/admin/src/pages/EditView/components/FormInputs/UID.d.ts +1 -1
  131. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/Editor.d.ts +1 -1
  132. package/dist/admin/src/pages/EditView/components/FormInputs/Wysiwyg/utils/utils.d.ts +7 -1
  133. package/dist/admin/src/pages/ListView/components/TableCells/CellContent.d.ts +11 -2
  134. package/dist/admin/src/pages/ListView/components/TableCells/CellValue.d.ts +1 -1
  135. package/dist/admin/src/preview/routes.d.ts +2 -2
  136. package/dist/admin/src/preview/services/preview.d.ts +1 -1
  137. package/dist/admin/src/router.d.ts +2 -2
  138. package/dist/admin/src/services/api.d.ts +1 -1
  139. package/dist/admin/src/services/components.d.ts +2 -2
  140. package/dist/admin/src/services/contentTypes.d.ts +3 -3
  141. package/dist/admin/src/services/documents.d.ts +19 -19
  142. package/dist/admin/src/services/homepage.d.ts +1 -1
  143. package/dist/admin/src/services/init.d.ts +1 -1
  144. package/dist/admin/src/services/relations.d.ts +2 -2
  145. package/dist/admin/src/services/uid.d.ts +3 -3
  146. package/dist/admin/src/utils/api.d.ts +2 -2
  147. package/dist/admin/src/utils/conditionalFields.d.ts +1 -0
  148. package/dist/admin/src/utils/objects.d.ts +7 -4
  149. package/dist/admin/src/utils/validation.d.ts +2 -1
  150. package/dist/admin/translations/en.json.js +1 -0
  151. package/dist/admin/translations/en.json.js.map +1 -1
  152. package/dist/admin/translations/en.json.mjs +1 -0
  153. package/dist/admin/translations/en.json.mjs.map +1 -1
  154. package/dist/admin/utils/api.js +6 -1
  155. package/dist/admin/utils/api.js.map +1 -1
  156. package/dist/admin/utils/api.mjs +6 -1
  157. package/dist/admin/utils/api.mjs.map +1 -1
  158. package/dist/admin/utils/conditionalFields.js.map +1 -1
  159. package/dist/admin/utils/conditionalFields.mjs.map +1 -1
  160. package/dist/admin/utils/objects.js +43 -13
  161. package/dist/admin/utils/objects.js.map +1 -1
  162. package/dist/admin/utils/objects.mjs +43 -13
  163. package/dist/admin/utils/objects.mjs.map +1 -1
  164. package/dist/admin/utils/validation.js.map +1 -1
  165. package/dist/admin/utils/validation.mjs.map +1 -1
  166. package/dist/server/controllers/collection-types.js +4 -1
  167. package/dist/server/controllers/collection-types.js.map +1 -1
  168. package/dist/server/controllers/collection-types.mjs +4 -1
  169. package/dist/server/controllers/collection-types.mjs.map +1 -1
  170. package/dist/server/controllers/relations.js +5 -4
  171. package/dist/server/controllers/relations.js.map +1 -1
  172. package/dist/server/controllers/relations.mjs +5 -4
  173. package/dist/server/controllers/relations.mjs.map +1 -1
  174. package/dist/server/controllers/validation/model-configuration.js +3 -1
  175. package/dist/server/controllers/validation/model-configuration.js.map +1 -1
  176. package/dist/server/controllers/validation/model-configuration.mjs +3 -1
  177. package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
  178. package/dist/server/homepage/services/homepage.js +27 -7
  179. package/dist/server/homepage/services/homepage.js.map +1 -1
  180. package/dist/server/homepage/services/homepage.mjs +27 -7
  181. package/dist/server/homepage/services/homepage.mjs.map +1 -1
  182. package/dist/server/services/permission.js +4 -3
  183. package/dist/server/services/permission.js.map +1 -1
  184. package/dist/server/services/permission.mjs +4 -3
  185. package/dist/server/services/permission.mjs.map +1 -1
  186. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  187. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  188. package/dist/server/src/homepage/services/homepage.d.ts.map +1 -1
  189. package/dist/server/src/services/permission.d.ts.map +1 -1
  190. package/package.json +6 -6
@@ -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 { 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":";;;;;;;;;;;;;AA0BA,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;IAEpC,MAAMO,SAAAA,GAAYC,YAAYjD,MAAAA,EAAQ;QACpCkD,WAAAA,EAAa;AACf,KAAA,CAAA;IAEA,MAAMC,gBAAAA,GAAmBpC,KAAAA,CAAMC,OAAO,CAAC,IAAA;AACrC,QAAA,MAAM,CAAC,EAAEoC,UAAAA,EAAY,EAAEC,MAAAA,GAAS,EAAE,EAAE,GAAG;AAAEA,YAAAA,MAAAA,EAAQ;AAAG,SAAC,EAAE,CAAC,GAAGjD,cAAAA,CAAea,MAAM,CAC9E,CAACC,UAAAA,GACCA,UAAAA,CAAWC,MAAM,KAAK,uCAAA,IACtBD,UAAAA,CAAWE,OAAO,KAAKvB,KAAAA,CAAAA;AAG3B,QAAA,MAAMyD,aAAAA,GAAgBD,MAAAA,CAAOpC,MAAM,CAAC,CAACsC,KAAAA,GAAAA;AACnC,YAAA,MAAMrB,SAAAA,GAAYvC,UAAU,CAAC4D,KAAAA,CAAM,IAAI,EAAC;YAExC,OAAOrB,SAAAA,CAAUE,IAAI,IAAI,CAAClD,oBAAoBoD,QAAQ,CAACJ,UAAUE,IAAI,CAAA;AACvE,QAAA,CAAA,CAAA;AAEA,QAAA,MAAMoB,WAAAA,GAAc;AAClB,YAAA,IAAA;AACA,YAAA,YAAA;AACGF,YAAAA,GAAAA,aAAAA;AACAnE,YAAAA,GAAAA,uBAAAA;AACC2B,YAAAA,GAAAA,iBAAAA,GAAoBzB,iBAAiB,EAAE;AACvCS,YAAAA,GAAAA,OAAAA,EAAS2D,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;oBACNvB,IAAAA,EAAM,aAAA;AACNwB,oBAAAA,KAAAA,EAAO7D,aAAAA,CAAc;AACnBgC,wBAAAA,EAAAA,EAAI8B,cAAAA,CAAe,gCAAA,CAAA;wBACnBC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAC,SAAAA,EAAW;AACT,wBAAA;AACEH,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJ+B,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT;AACD,qBAAA;oBACD9B,OAAAA,EAAS;AACP,wBAAA;AACE8D,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAI8B,cAAAA,CAAe,oCAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEgC,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAI8B,cAAAA,CAAe,wCAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEgC,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAI8B,cAAAA,CAAe,gDAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEgC,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;AACnBgC,gCAAAA,EAAAA,EAAI8B,cAAAA,CAAe,kDAAA,CAAA;gCACnBC,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT;AACD;AACH,iBAAA;AACF,YAAA;YAEA,MAAMM,SAAAA,GAAYvC,UAAU,CAACgE,IAAAA,CAAK;AAElC,YAAA,IAAI,CAACzB,SAAAA,IAAahD,mBAAAA,CAAoBoD,QAAQ,CAACJ,SAAAA,CAAUE,IAAI,CAAA,EAAG;gBAC9D,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAM4B,aAAAA,GAAgBvE,MAAAA,CAAOwE,SAAS,GAAGN,IAAAA,CAAK;AAC9C,YAAA,IAAI,CAACK,aAAAA,EAAe;gBAClB,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,MAAM,EAAEE,SAAAA,EAAWC,aAAAA,GAAgB,EAAE,EAAEP,KAAK,EAAE,GAAGI,aAAAA;AAEjD,YAAA,IAAI/C,MAAAA,GAAyB;AAC3B0C,gBAAAA,IAAAA;AACAC,gBAAAA,KAAAA,EAAOA,KAAAA,IAAS,EAAA;gBAChBM,SAAAA,EAAWE,YAAAA,CAAalC,WAAWiC,aAAAA,EAAe;AAAEzD,oBAAAA,OAAAA;AAAS2D,oBAAAA,UAAAA,EAAY;AAAG,iBAAA,CAAA;AAC5EjC,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;oBACTqD,KAAAA,EAAOC,gBAAAA;AACPzE,oBAAAA,OAAAA,EAASiD,KAAAA,CAAMW,GAAG,CAAC,CAACc,QAAU;AAC5BZ,4BAAAA,KAAAA,EAAOa,cAAAA,CAAeD,IAAAA,CAAAA;4BACtB5C,KAAAA,EAAO4C,IAAAA,CAAKzC,EAAE,CAAC2C,QAAQ;yBACzB,CAAA,CAAA;oBACAX,SAAAA,EAAW;AACT,wBAAA;AACEH,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJ+B,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT,yBAAA;AACA,wBAAA;AACEgC,4BAAAA,KAAAA,EAAO7D,aAAAA,CAAc;gCACnBgC,EAAAA,EAAI,2CAAA;gCACJ+B,cAAAA,EAAgB;AAClB,6BAAA,CAAA;4BACAlC,KAAAA,EAAO;AACT;AACD,qBAAA;oBACDsC,SAAAA,EAAW;wBACTP,IAAAA,EAAM,IAAA;wBACNvB,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,UAAUyC,IAAI,CAACjB,GAAG,CAAC,CAAC9B,SAAW;4BACtCgC,KAAAA,EAAOhC,KAAAA;AACPA,4BAAAA;yBACF,CAAA;AACF,iBAAA;AACF,YAAA;YAEA,OAAOX,MAAAA;AACT,QAAA,CAAA,CAAA,CACCA,MAAM,CAAC2D,OAAAA,CAAAA;;;;AAKV,QAAA,MAAM,EAAEzB,gBAAAA,EAAkB0B,eAAe,EAAE,GAAGjE,iBAAiB5B,wBAAAA,EAA0B;YACvFmE,gBAAAA,EAAkBK,WAAAA;AAClB/D,YAAAA;AACF,SAAA,CAAA;AAEA,QAAA,MAAMqF,eAAe,CAAClB,KAAAA,GACpB,OAAOA,KAAAA,KAAU,QAAA,GAAWA,QAAQ7D,aAAAA,CAAc6D,KAAAA,CAAAA;AAEpD,QAAA,MAAMmB,cAAchC,KAAAA,CAAMW,GAAG,CAAC,CAACc,QAAU;AACvCZ,gBAAAA,KAAAA,EAAOa,cAAAA,CAAeD,IAAAA,CAAAA;gBACtB5C,KAAAA,EAAO4C,IAAAA,CAAKzC,EAAE,CAAC2C,QAAQ;aACzB,CAAA,CAAA;AAEA,QAAA,MAAMM,SAAAA,GAAYH,eAAAA,CAAgBnB,GAAG,CAAiB,CAACzC,MAAAA,GAAAA;AACrD,YAAA,MAAMgE,IAAAA,GAAuB;AAC3B,gBAAA,GAAGhE,MAAM;gBACT2C,KAAAA,EAAOkB,YAAAA,CAAa7D,OAAO2C,KAAK,CAAA;AAChCG,gBAAAA,SAAAA,EAAW9C,OAAO8C,SAAS,EAAEL,GAAAA,CAAI,CAACwB,MAAQ;AAAE,wBAAA,GAAGA,EAAE;wBAAEtB,KAAAA,EAAOkB,YAAAA,CAAaI,GAAGtB,KAAK;qBAAE,CAAA;AACnF,aAAA;;YAGA,IAAIxE,sBAAAA,CAAuBkD,QAAQ,CAACrB,MAAAA,CAAO0C,IAAI,KAAK,CAACsB,IAAAA,CAAKnF,OAAO,EAAEuB,MAAAA,EAAQ;AACzE4D,gBAAAA,IAAAA,CAAKnF,OAAO,GAAGiF,WAAAA;AACjB,YAAA;YAEA,OAAOE,IAAAA;AACT,QAAA,CAAA,CAAA;AAEA,QAAA,OAAOD,SAAAA,CAAUG,QAAQ,CAAC,CAACC,CAAAA,EAAGC,CAAAA,GAAMrC,SAAAA,CAAUsC,OAAO,CAACF,CAAAA,CAAExB,KAAK,EAAEyB,EAAEzB,KAAK,CAAA,CAAA;IACxE,CAAA,EAAG;AACDxD,QAAAA,cAAAA;AACAU,QAAAA,iBAAAA;AACAjB,QAAAA,KAAAA;AACAF,QAAAA,UAAAA;AACAF,QAAAA,MAAAA,CAAOwE,SAAS;AAChBvD,QAAAA,OAAAA;AACAjB,QAAAA,MAAAA;AACAsD,QAAAA,KAAAA;AACAhD,QAAAA,aAAAA;AACAiD,QAAAA,SAAAA;QACAlD,OAAAA,EAAS2D,eAAAA;AACT7C,QAAAA;AACD,KAAA,CAAA;AAED,IAAA,MAAM2E,eAAe,CAACC,MAAAA,GAAAA;AACpB,QAAA,IAAIA,MAAAA,EAAQ;YACVtF,UAAAA,CAAW,mBAAA,CAAA;AACb,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,MAAMuF,qBAAgD,CAACjD,IAAAA,GAAAA;AACrD,QAAA,MAAMN,SAAAA,GAAYvC,UAAU,CAAC6C,IAAAA,CAAKmB,IAAI,CAAC;AAEvC,QAAA,IAAIzB,SAAAA,EAAW;AACbhC,YAAAA,UAAAA,CAAW,kBAAA,EAAoB;gBAC7BwF,WAAAA,EAAaxD,SAAAA,CAAUE,IAAI,KAAK;AAClC,aAAA,CAAA;AACF,QAAA;AACF,IAAA,CAAA;IAEA,qBACEuD,GAAA,CAACC,QAAQtG,IAAI,EAAA;QACXC,QAAAA,EAAUA,QAAAA;QACVO,OAAAA,EAASqD,gBAAAA;QACToC,YAAAA,EAAcA,YAAAA;QACdM,QAAAA,EAAUJ,kBAAAA;AAET/F,QAAAA,QAAAA,EAAAA;;AAGP,CAAA;AAEA;;AAEkG,qGAElG,MAAM6E,gBAAAA,GAAmB,CAAC,EAAEZ,IAAI,EAA2B,GAAA;AACzD,IAAA,MAAM,CAACmC,QAAAA,EAAUC,WAAAA,CAAY,GAAGhF,KAAAA,CAAMiF,QAAQ,CAAC,EAAA,CAAA;AAC/C,IAAA,MAAM,CAACC,MAAAA,EAAQC,SAAAA,CAAU,GAAGnF,KAAAA,CAAMiF,QAAQ,CAAC,EAAA,CAAA;IAC3C,MAAM,EAAEjG,aAAa,EAAE,GAAGE,OAAAA,EAAAA;IAE1B,MAAMkG,eAAAA,GAAkBC,YAAYH,MAAAA,EAAQ,GAAA,CAAA;AAE5C,IAAA,MAAM,EAAEzD,IAAI,EAAEE,SAAS,EAAE,GAAGE,aAAAA,CAAc;AACxCkD,QAAAA,QAAAA;QACAO,EAAAA,EAAIF;AACN,KAAA,CAAA;AACA,IAAA,MAAM5C,QAAQ+C,QAAAA,CAAS3C,IAAAA,CAAAA;AAEvB,IAAA,MAAM4C,mBAAmB,CAACf,MAAAA,GAAAA;AACxB,QAAA,IAAI,CAACA,MAAAA,EAAQ;YACXO,WAAAA,CAAY,EAAA,CAAA;AACd,QAAA;AACF,IAAA,CAAA;IAEA,MAAM,EAAEhD,QAAQ,EAAE,EAAEyD,UAAU,EAAE,GAAGhE,QAAQ,EAAC;IAC5C,MAAM,EAAEiE,YAAY,CAAC,EAAEC,OAAO,CAAC,EAAE,GAAGF,UAAAA,IAAc,EAAC;AAEnD,IAAA,qBACEb,GAAA,CAACgB,QAAAA,EAAAA;AACC/E,QAAAA,KAAAA,EAAO2B,MAAM3B,KAAK;AAClBgF,QAAAA,YAAAA,EAAY7G,aAAAA,CAAc;YACxBgC,EAAAA,EAAI,sDAAA;YACJ+B,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAyB,YAAAA,EAAcgB,gBAAAA;AACdV,QAAAA,QAAAA,EAAU,CAACjE,KAAAA,GAAU2B,KAAAA,CAAMsC,QAAQ,CAAClC,IAAAA,EAAM/B,KAAAA,CAAAA;QAC1CiF,OAAAA,EAASnE,SAAAA;QACToE,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,CAACtF,KAAK,CAAA;AACjC,QAAA,CAAA;kBAECmB,KAAAA,CAAMW,GAAG,CAAC,CAACc,IAAAA,GAAAA;AACV,YAAA,qBACEmB,GAAA,CAACwB,cAAAA,EAAAA;gBAA6BvF,KAAAA,EAAO4C,IAAAA,CAAKzC,EAAE,CAAC2C,QAAQ,EAAA;0BAClDD,cAAAA,CAAeD,IAAAA;AADGA,aAAAA,EAAAA,IAAAA,CAAKzC,EAAE,CAAA;AAIhC,QAAA,CAAA;;AAGN,CAAA;AAEA,MAAMqF,eAAAA,GAAkB;AACtB9H,IAAAA,IAAAA;AACA+H,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 } = 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: formatMessage({ id: value, defaultMessage: 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 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<string>(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","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","isLoading","_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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"}
@@ -118,6 +118,42 @@ EditAction.position = 'table-row';
118
118
  fill: currentColor;
119
119
  }
120
120
  `;
121
+ const OpenInNewTabAction = ({ documentId })=>{
122
+ const { formatMessage } = reactIntl.useIntl();
123
+ const { canRead } = DocumentRBAC.useDocumentRBAC('OpenInNewTabAction', ({ canRead })=>({
124
+ canRead
125
+ }));
126
+ const [{ query }] = strapiAdmin.useQueryParams();
127
+ // Resolve the entry's absolute URL (incl. router basename) so we can open it
128
+ // in a real new browser tab. The primary list-view cell is also a link, this
129
+ // gives the same affordance an explicit, discoverable menu entry.
130
+ const href = reactRouterDom.useHref({
131
+ pathname: documentId ?? '',
132
+ search: qs.stringify({
133
+ plugins: query.plugins
134
+ })
135
+ });
136
+ return {
137
+ disabled: !canRead || !documentId,
138
+ icon: /*#__PURE__*/ jsxRuntime.jsx(StyledExternalLink, {}),
139
+ label: formatMessage({
140
+ id: 'content-manager.actions.open-in-new-tab.label',
141
+ defaultMessage: 'Open in new tab'
142
+ }),
143
+ position: 'table-row',
144
+ onClick: ()=>{
145
+ window.open(href, '_blank', 'noopener,noreferrer');
146
+ }
147
+ };
148
+ };
149
+ // No `type` is set: it's an optional discriminator constrained to a known union
150
+ // and this action is identified by its component name instead.
151
+ OpenInNewTabAction.position = 'table-row';
152
+ const StyledExternalLink = styledComponents.styled(Icons.ExternalLink)`
153
+ path {
154
+ fill: currentColor;
155
+ }
156
+ `;
121
157
  const CloneAction = ({ model, documentId })=>{
122
158
  const navigate = reactRouterDom.useNavigate();
123
159
  const { formatMessage } = reactIntl.useIntl();
@@ -220,6 +256,7 @@ CloneAction.position = 'table-row';
220
256
  `;
221
257
  const DEFAULT_TABLE_ROW_ACTIONS = [
222
258
  EditAction,
259
+ OpenInNewTabAction,
223
260
  CloneAction
224
261
  ];
225
262
 
@@ -1 +1 @@
1
- {"version":3,"file":"TableActions.js","sources":["../../../../../admin/src/pages/ListView/components/TableActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useNotification,\n useStrapiApp,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { Button, LinkButton, Modal } from '@strapi/design-system';\nimport { Duplicate, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { Document, useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { isBaseQueryError } from '../../../utils/api';\nimport { DocumentActionsMenu } from '../../EditView/components/DocumentActions';\n\nimport { AutoCloneFailureModalBody } from './AutoCloneFailureModal';\n\nimport type { ProhibitedCloningField } from '../../../../../shared/contracts/collection-types';\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n DocumentActionProps,\n} from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * TableActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableActionsProps {\n document: Document;\n}\n\nconst TableActions = ({ document }: TableActionsProps) => {\n const { formatMessage } = useIntl();\n const { model, collectionType } = useDoc();\n const plugins = useStrapiApp('TableActions', (state) => state.plugins);\n\n const props: DocumentActionProps = {\n activeTab: null,\n model,\n documentId: document.documentId,\n collectionType,\n document,\n };\n\n return (\n <DescriptionComponentRenderer\n props={props}\n descriptions={(plugins['content-manager'].apis as ContentManagerPlugin['config']['apis'])\n .getDocumentActions('table-row')\n // We explicitly remove the PublishAction from description so we never render it and we don't make unnecessary requests.\n .filter((action) => action.name !== 'PublishAction')}\n >\n {(actions) => {\n const tableRowActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('table-row');\n });\n\n return (\n <DocumentActionsMenu\n actions={tableRowActions}\n label={formatMessage({\n id: 'content-manager.containers.list.table.row-actions',\n defaultMessage: 'Row actions',\n })}\n variant=\"ghost\"\n />\n );\n }}\n </DescriptionComponentRenderer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditAction: DocumentActionComponent = ({ documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('EditAction', ({ canRead }) => ({ canRead }));\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n return {\n disabled: !canRead,\n icon: <StyledPencil />,\n label: formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to edit a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.edit.error',\n defaultMessage: 'An error occurred while trying to edit the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n navigate({\n pathname: documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n },\n };\n};\n\nEditAction.type = 'edit';\nEditAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CloneAction: DocumentActionComponent = ({ model, documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canCreate } = useDocumentRBAC('CloneAction', ({ canCreate }) => ({ canCreate }));\n const { toggleNotification } = useNotification();\n const { autoClone } = useDocumentActions();\n const [prohibitedFields, setProhibitedFields] = React.useState<ProhibitedCloningField[]>([]);\n const [{ query }] = useQueryParams<{ plugins?: Record<string, any> }>();\n\n return {\n disabled: !canCreate,\n icon: <StyledDuplicate />,\n label: formatMessage({\n id: 'content-manager.actions.clone.label',\n defaultMessage: 'Duplicate',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to clone a document in the table without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.clone.error',\n defaultMessage: 'An error occurred while trying to clone the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await autoClone({\n model,\n sourceId: documentId,\n locale: query.plugins?.i18n?.locale,\n });\n\n if ('data' in res) {\n navigate({\n pathname: res.data.documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n\n /**\n * We return true because we don't need to show a modal anymore.\n */\n return true;\n }\n\n if (\n isBaseQueryError(res.error) &&\n res.error.details &&\n typeof res.error.details === 'object' &&\n 'prohibitedFields' in res.error.details &&\n Array.isArray(res.error.details.prohibitedFields)\n ) {\n const prohibitedFields = res.error.details.prohibitedFields as ProhibitedCloningField[];\n\n setProhibitedFields(prohibitedFields);\n }\n },\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.header',\n defaultMessage: 'Duplicate',\n }),\n content: <AutoCloneFailureModalBody prohibitedFields={prohibitedFields} />,\n footer: ({ onClose }) => {\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <LinkButton\n tag={NavLink}\n to={{\n pathname: `clone/${documentId}`,\n search: stringify({\n plugins: query.plugins,\n }),\n }}\n >\n {formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.create',\n defaultMessage: 'Create',\n })}\n </LinkButton>\n </Modal.Footer>\n );\n },\n },\n };\n};\n\nCloneAction.type = 'clone';\nCloneAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledDuplicate = styled(Duplicate)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_TABLE_ROW_ACTIONS = [EditAction, CloneAction];\n\nexport { TableActions, DEFAULT_TABLE_ROW_ACTIONS };\n"],"names":["TableActions","document","formatMessage","useIntl","model","collectionType","useDoc","plugins","useStrapiApp","state","props","activeTab","documentId","_jsx","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","filter","action","name","actions","tableRowActions","positions","Array","isArray","position","includes","DocumentActionsMenu","label","id","defaultMessage","variant","EditAction","navigate","useNavigate","canRead","useDocumentRBAC","toggleNotification","useNotification","query","useQueryParams","disabled","icon","StyledPencil","onClick","console","error","message","type","pathname","search","stringify","styled","Pencil","CloneAction","canCreate","autoClone","useDocumentActions","prohibitedFields","setProhibitedFields","React","useState","StyledDuplicate","res","sourceId","locale","i18n","data","isBaseQueryError","details","dialog","title","content","AutoCloneFailureModalBody","footer","onClose","_jsxs","Modal","Footer","Button","LinkButton","tag","NavLink","to","Duplicate","DEFAULT_TABLE_ROW_ACTIONS"],"mappings":"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"}
1
+ {"version":3,"file":"TableActions.js","sources":["../../../../../admin/src/pages/ListView/components/TableActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useNotification,\n useStrapiApp,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { Button, LinkButton, Modal } from '@strapi/design-system';\nimport { Duplicate, ExternalLink, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useHref, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { Document, useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { isBaseQueryError } from '../../../utils/api';\nimport { DocumentActionsMenu } from '../../EditView/components/DocumentActions';\n\nimport { AutoCloneFailureModalBody } from './AutoCloneFailureModal';\n\nimport type { ProhibitedCloningField } from '../../../../../shared/contracts/collection-types';\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n DocumentActionProps,\n} from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * TableActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableActionsProps {\n document: Document;\n}\n\nconst TableActions = ({ document }: TableActionsProps) => {\n const { formatMessage } = useIntl();\n const { model, collectionType } = useDoc();\n const plugins = useStrapiApp('TableActions', (state) => state.plugins);\n\n const props: DocumentActionProps = {\n activeTab: null,\n model,\n documentId: document.documentId,\n collectionType,\n document,\n };\n\n return (\n <DescriptionComponentRenderer\n props={props}\n descriptions={(plugins['content-manager'].apis as ContentManagerPlugin['config']['apis'])\n .getDocumentActions('table-row')\n // We explicitly remove the PublishAction from description so we never render it and we don't make unnecessary requests.\n .filter((action) => action.name !== 'PublishAction')}\n >\n {(actions) => {\n const tableRowActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('table-row');\n });\n\n return (\n <DocumentActionsMenu\n actions={tableRowActions}\n label={formatMessage({\n id: 'content-manager.containers.list.table.row-actions',\n defaultMessage: 'Row actions',\n })}\n variant=\"ghost\"\n />\n );\n }}\n </DescriptionComponentRenderer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditAction: DocumentActionComponent = ({ documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('EditAction', ({ canRead }) => ({ canRead }));\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n return {\n disabled: !canRead,\n icon: <StyledPencil />,\n label: formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to edit a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.edit.error',\n defaultMessage: 'An error occurred while trying to edit the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n navigate({\n pathname: documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n },\n };\n};\n\nEditAction.type = 'edit';\nEditAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst OpenInNewTabAction: DocumentActionComponent = ({ documentId }) => {\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('OpenInNewTabAction', ({ canRead }) => ({ canRead }));\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n // Resolve the entry's absolute URL (incl. router basename) so we can open it\n // in a real new browser tab. The primary list-view cell is also a link, this\n // gives the same affordance an explicit, discoverable menu entry.\n const href = useHref({\n pathname: documentId ?? '',\n search: stringify({ plugins: query.plugins }),\n });\n\n return {\n disabled: !canRead || !documentId,\n icon: <StyledExternalLink />,\n label: formatMessage({\n id: 'content-manager.actions.open-in-new-tab.label',\n defaultMessage: 'Open in new tab',\n }),\n position: 'table-row',\n onClick: () => {\n window.open(href, '_blank', 'noopener,noreferrer');\n },\n };\n};\n\n// No `type` is set: it's an optional discriminator constrained to a known union\n// and this action is identified by its component name instead.\nOpenInNewTabAction.position = 'table-row';\n\nconst StyledExternalLink = styled(ExternalLink)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CloneAction: DocumentActionComponent = ({ model, documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canCreate } = useDocumentRBAC('CloneAction', ({ canCreate }) => ({ canCreate }));\n const { toggleNotification } = useNotification();\n const { autoClone } = useDocumentActions();\n const [prohibitedFields, setProhibitedFields] = React.useState<ProhibitedCloningField[]>([]);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n return {\n disabled: !canCreate,\n icon: <StyledDuplicate />,\n label: formatMessage({\n id: 'content-manager.actions.clone.label',\n defaultMessage: 'Duplicate',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to clone a document in the table without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.clone.error',\n defaultMessage: 'An error occurred while trying to clone the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await autoClone({\n model,\n sourceId: documentId,\n locale: query.plugins?.i18n?.locale,\n });\n\n if ('data' in res) {\n navigate({\n pathname: res.data.documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n\n /**\n * We return true because we don't need to show a modal anymore.\n */\n return true;\n }\n\n if (\n isBaseQueryError(res.error) &&\n res.error.details &&\n typeof res.error.details === 'object' &&\n 'prohibitedFields' in res.error.details &&\n Array.isArray(res.error.details.prohibitedFields)\n ) {\n const prohibitedFields = res.error.details.prohibitedFields as ProhibitedCloningField[];\n\n setProhibitedFields(prohibitedFields);\n }\n },\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.header',\n defaultMessage: 'Duplicate',\n }),\n content: <AutoCloneFailureModalBody prohibitedFields={prohibitedFields} />,\n footer: ({ onClose }) => {\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <LinkButton\n tag={NavLink}\n to={{\n pathname: `clone/${documentId}`,\n search: stringify({\n plugins: query.plugins,\n }),\n }}\n >\n {formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.create',\n defaultMessage: 'Create',\n })}\n </LinkButton>\n </Modal.Footer>\n );\n },\n },\n };\n};\n\nCloneAction.type = 'clone';\nCloneAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledDuplicate = styled(Duplicate)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_TABLE_ROW_ACTIONS = [EditAction, OpenInNewTabAction, CloneAction];\n\nexport { TableActions, DEFAULT_TABLE_ROW_ACTIONS };\n"],"names":["TableActions","document","formatMessage","useIntl","model","collectionType","useDoc","plugins","useStrapiApp","state","props","activeTab","documentId","_jsx","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","filter","action","name","actions","tableRowActions","positions","Array","isArray","position","includes","DocumentActionsMenu","label","id","defaultMessage","variant","EditAction","navigate","useNavigate","canRead","useDocumentRBAC","toggleNotification","useNotification","query","useQueryParams","disabled","icon","StyledPencil","onClick","console","error","message","type","pathname","search","stringify","styled","Pencil","OpenInNewTabAction","href","useHref","StyledExternalLink","window","open","ExternalLink","CloneAction","canCreate","autoClone","useDocumentActions","prohibitedFields","setProhibitedFields","React","useState","StyledDuplicate","res","sourceId","locale","i18n","data","isBaseQueryError","details","dialog","title","content","AutoCloneFailureModalBody","footer","onClose","_jsxs","Modal","Footer","Button","LinkButton","tag","NavLink","to","Duplicate","DEFAULT_TABLE_ROW_ACTIONS"],"mappings":"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"}
@@ -2,10 +2,10 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import * as React from 'react';
3
3
  import { useNotification, useQueryParams, useStrapiApp, DescriptionComponentRenderer } from '@strapi/admin/strapi-admin';
4
4
  import { Modal, Button, LinkButton } from '@strapi/design-system';
5
- import { Pencil, Duplicate } from '@strapi/icons';
5
+ import { Pencil, ExternalLink, Duplicate } from '@strapi/icons';
6
6
  import { stringify } from 'qs';
7
7
  import { useIntl } from 'react-intl';
8
- import { useNavigate, NavLink } from 'react-router-dom';
8
+ import { useNavigate, useHref, NavLink } from 'react-router-dom';
9
9
  import { styled } from 'styled-components';
10
10
  import { useDocumentRBAC } from '../../../features/DocumentRBAC.mjs';
11
11
  import { useDoc } from '../../../hooks/useDocument.mjs';
@@ -96,6 +96,42 @@ EditAction.position = 'table-row';
96
96
  fill: currentColor;
97
97
  }
98
98
  `;
99
+ const OpenInNewTabAction = ({ documentId })=>{
100
+ const { formatMessage } = useIntl();
101
+ const { canRead } = useDocumentRBAC('OpenInNewTabAction', ({ canRead })=>({
102
+ canRead
103
+ }));
104
+ const [{ query }] = useQueryParams();
105
+ // Resolve the entry's absolute URL (incl. router basename) so we can open it
106
+ // in a real new browser tab. The primary list-view cell is also a link, this
107
+ // gives the same affordance an explicit, discoverable menu entry.
108
+ const href = useHref({
109
+ pathname: documentId ?? '',
110
+ search: stringify({
111
+ plugins: query.plugins
112
+ })
113
+ });
114
+ return {
115
+ disabled: !canRead || !documentId,
116
+ icon: /*#__PURE__*/ jsx(StyledExternalLink, {}),
117
+ label: formatMessage({
118
+ id: 'content-manager.actions.open-in-new-tab.label',
119
+ defaultMessage: 'Open in new tab'
120
+ }),
121
+ position: 'table-row',
122
+ onClick: ()=>{
123
+ window.open(href, '_blank', 'noopener,noreferrer');
124
+ }
125
+ };
126
+ };
127
+ // No `type` is set: it's an optional discriminator constrained to a known union
128
+ // and this action is identified by its component name instead.
129
+ OpenInNewTabAction.position = 'table-row';
130
+ const StyledExternalLink = styled(ExternalLink)`
131
+ path {
132
+ fill: currentColor;
133
+ }
134
+ `;
99
135
  const CloneAction = ({ model, documentId })=>{
100
136
  const navigate = useNavigate();
101
137
  const { formatMessage } = useIntl();
@@ -198,6 +234,7 @@ CloneAction.position = 'table-row';
198
234
  `;
199
235
  const DEFAULT_TABLE_ROW_ACTIONS = [
200
236
  EditAction,
237
+ OpenInNewTabAction,
201
238
  CloneAction
202
239
  ];
203
240
 
@@ -1 +1 @@
1
- {"version":3,"file":"TableActions.mjs","sources":["../../../../../admin/src/pages/ListView/components/TableActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useNotification,\n useStrapiApp,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { Button, LinkButton, Modal } from '@strapi/design-system';\nimport { Duplicate, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { Document, useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { isBaseQueryError } from '../../../utils/api';\nimport { DocumentActionsMenu } from '../../EditView/components/DocumentActions';\n\nimport { AutoCloneFailureModalBody } from './AutoCloneFailureModal';\n\nimport type { ProhibitedCloningField } from '../../../../../shared/contracts/collection-types';\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n DocumentActionProps,\n} from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * TableActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableActionsProps {\n document: Document;\n}\n\nconst TableActions = ({ document }: TableActionsProps) => {\n const { formatMessage } = useIntl();\n const { model, collectionType } = useDoc();\n const plugins = useStrapiApp('TableActions', (state) => state.plugins);\n\n const props: DocumentActionProps = {\n activeTab: null,\n model,\n documentId: document.documentId,\n collectionType,\n document,\n };\n\n return (\n <DescriptionComponentRenderer\n props={props}\n descriptions={(plugins['content-manager'].apis as ContentManagerPlugin['config']['apis'])\n .getDocumentActions('table-row')\n // We explicitly remove the PublishAction from description so we never render it and we don't make unnecessary requests.\n .filter((action) => action.name !== 'PublishAction')}\n >\n {(actions) => {\n const tableRowActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('table-row');\n });\n\n return (\n <DocumentActionsMenu\n actions={tableRowActions}\n label={formatMessage({\n id: 'content-manager.containers.list.table.row-actions',\n defaultMessage: 'Row actions',\n })}\n variant=\"ghost\"\n />\n );\n }}\n </DescriptionComponentRenderer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditAction: DocumentActionComponent = ({ documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('EditAction', ({ canRead }) => ({ canRead }));\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n return {\n disabled: !canRead,\n icon: <StyledPencil />,\n label: formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to edit a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.edit.error',\n defaultMessage: 'An error occurred while trying to edit the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n navigate({\n pathname: documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n },\n };\n};\n\nEditAction.type = 'edit';\nEditAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CloneAction: DocumentActionComponent = ({ model, documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canCreate } = useDocumentRBAC('CloneAction', ({ canCreate }) => ({ canCreate }));\n const { toggleNotification } = useNotification();\n const { autoClone } = useDocumentActions();\n const [prohibitedFields, setProhibitedFields] = React.useState<ProhibitedCloningField[]>([]);\n const [{ query }] = useQueryParams<{ plugins?: Record<string, any> }>();\n\n return {\n disabled: !canCreate,\n icon: <StyledDuplicate />,\n label: formatMessage({\n id: 'content-manager.actions.clone.label',\n defaultMessage: 'Duplicate',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to clone a document in the table without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.clone.error',\n defaultMessage: 'An error occurred while trying to clone the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await autoClone({\n model,\n sourceId: documentId,\n locale: query.plugins?.i18n?.locale,\n });\n\n if ('data' in res) {\n navigate({\n pathname: res.data.documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n\n /**\n * We return true because we don't need to show a modal anymore.\n */\n return true;\n }\n\n if (\n isBaseQueryError(res.error) &&\n res.error.details &&\n typeof res.error.details === 'object' &&\n 'prohibitedFields' in res.error.details &&\n Array.isArray(res.error.details.prohibitedFields)\n ) {\n const prohibitedFields = res.error.details.prohibitedFields as ProhibitedCloningField[];\n\n setProhibitedFields(prohibitedFields);\n }\n },\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.header',\n defaultMessage: 'Duplicate',\n }),\n content: <AutoCloneFailureModalBody prohibitedFields={prohibitedFields} />,\n footer: ({ onClose }) => {\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <LinkButton\n tag={NavLink}\n to={{\n pathname: `clone/${documentId}`,\n search: stringify({\n plugins: query.plugins,\n }),\n }}\n >\n {formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.create',\n defaultMessage: 'Create',\n })}\n </LinkButton>\n </Modal.Footer>\n );\n },\n },\n };\n};\n\nCloneAction.type = 'clone';\nCloneAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledDuplicate = styled(Duplicate)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_TABLE_ROW_ACTIONS = [EditAction, CloneAction];\n\nexport { TableActions, DEFAULT_TABLE_ROW_ACTIONS };\n"],"names":["TableActions","document","formatMessage","useIntl","model","collectionType","useDoc","plugins","useStrapiApp","state","props","activeTab","documentId","_jsx","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","filter","action","name","actions","tableRowActions","positions","Array","isArray","position","includes","DocumentActionsMenu","label","id","defaultMessage","variant","EditAction","navigate","useNavigate","canRead","useDocumentRBAC","toggleNotification","useNotification","query","useQueryParams","disabled","icon","StyledPencil","onClick","console","error","message","type","pathname","search","stringify","styled","Pencil","CloneAction","canCreate","autoClone","useDocumentActions","prohibitedFields","setProhibitedFields","React","useState","StyledDuplicate","res","sourceId","locale","i18n","data","isBaseQueryError","details","dialog","title","content","AutoCloneFailureModalBody","footer","onClose","_jsxs","Modal","Footer","Button","LinkButton","tag","NavLink","to","Duplicate","DEFAULT_TABLE_ROW_ACTIONS"],"mappings":";;;;;;;;;;;;;;;;AAsCA,MAAMA,YAAAA,GAAe,CAAC,EAAEC,QAAQ,EAAqB,GAAA;IACnD,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAM,EAAEC,KAAK,EAAEC,cAAc,EAAE,GAAGC,MAAAA,EAAAA;AAClC,IAAA,MAAMC,UAAUC,YAAAA,CAAa,cAAA,EAAgB,CAACC,KAAAA,GAAUA,MAAMF,OAAO,CAAA;AAErE,IAAA,MAAMG,KAAAA,GAA6B;QACjCC,SAAAA,EAAW,IAAA;AACXP,QAAAA,KAAAA;AACAQ,QAAAA,UAAAA,EAAYX,SAASW,UAAU;AAC/BP,QAAAA,cAAAA;AACAJ,QAAAA;AACF,KAAA;AAEA,IAAA,qBACEY,GAAA,CAACC,4BAAAA,EAAAA;QACCJ,KAAAA,EAAOA,KAAAA;QACPK,YAAAA,EAAeR,OAAO,CAAC,iBAAA,CAAkB,CAACS,IAAI,CAC3CC,kBAAkB,CAAC,WAAA,CACpB;AACCC,SAAAA,MAAM,CAAC,CAACC,MAAAA,GAAWA,MAAAA,CAAOC,IAAI,KAAK,eAAA,CAAA;kBAErC,CAACC,OAAAA,GAAAA;AACA,YAAA,MAAMC,eAAAA,GAAkBD,OAAAA,CAAQH,MAAM,CAAC,CAACC,MAAAA,GAAAA;gBACtC,MAAMI,SAAAA,GAAYC,MAAMC,OAAO,CAACN,OAAOO,QAAQ,CAAA,GAAIP,MAAAA,CAAOO,QAAQ,GAAG;AAACP,oBAAAA,MAAAA,CAAOO;AAAS,iBAAA;gBACtF,OAAOH,SAAAA,CAAUI,QAAQ,CAAC,WAAA,CAAA;AAC5B,YAAA,CAAA,CAAA;AAEA,YAAA,qBACEd,GAAA,CAACe,mBAAAA,EAAAA;gBACCP,OAAAA,EAASC,eAAAA;AACTO,gBAAAA,KAAAA,EAAO3B,aAAAA,CAAc;oBACnB4B,EAAAA,EAAI,mDAAA;oBACJC,cAAAA,EAAgB;AAClB,iBAAA,CAAA;gBACAC,OAAAA,EAAQ;;AAGd,QAAA;;AAGN;AAEA;;AAEkG,qGAElG,MAAMC,UAAAA,GAAsC,CAAC,EAAErB,UAAU,EAAE,GAAA;AACzD,IAAA,MAAMsB,QAAAA,GAAWC,WAAAA,EAAAA;IACjB,MAAM,EAAEjC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEiC,OAAO,EAAE,GAAGC,eAAAA,CAAgB,YAAA,EAAc,CAAC,EAAED,OAAO,EAAE,IAAM;AAAEA,YAAAA;SAAQ,CAAA,CAAA;IAC9E,MAAM,EAAEE,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IAEpB,OAAO;AACLC,QAAAA,QAAAA,EAAU,CAACN,OAAAA;AACXO,QAAAA,IAAAA,gBAAM9B,GAAA,CAAC+B,YAAAA,EAAAA,EAAAA,CAAAA;AACPf,QAAAA,KAAAA,EAAO3B,aAAAA,CAAc;YACnB4B,EAAAA,EAAI,oCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAL,QAAAA,EAAU,WAAA;QACVmB,OAAAA,EAAS,UAAA;AACP,YAAA,IAAI,CAACjC,UAAAA,EAAY;AACfkC,gBAAAA,OAAAA,CAAQC,KAAK,CACX,yGAAA,CAAA;gBAGFT,kBAAAA,CAAmB;AACjBU,oBAAAA,OAAAA,EAAS9C,aAAAA,CAAc;wBACrB4B,EAAAA,EAAI,oCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAkB,IAAAA,EAAM;AACR,iBAAA,CAAA;AAEA,gBAAA;AACF,YAAA;YAEAf,QAAAA,CAAS;gBACPgB,QAAAA,EAAUtC,UAAAA;AACVuC,gBAAAA,MAAAA,EAAQC,SAAAA,CAAU;AAChB7C,oBAAAA,OAAAA,EAASiC,MAAMjC;AACjB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;AAEA0B,UAAAA,CAAWgB,IAAI,GAAG,MAAA;AAClBhB,UAAAA,CAAWP,QAAQ,GAAG,WAAA;AAEtB;;;AAGC,IACD,MAAMkB,YAAAA,GAAeS,MAAAA,CAAOC,MAAAA,CAAO;;;;AAInC,CAAC;AAED,MAAMC,cAAuC,CAAC,EAAEnD,KAAK,EAAEQ,UAAU,EAAE,GAAA;AACjE,IAAA,MAAMsB,QAAAA,GAAWC,WAAAA,EAAAA;IACjB,MAAM,EAAEjC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEqD,SAAS,EAAE,GAAGnB,eAAAA,CAAgB,aAAA,EAAe,CAAC,EAAEmB,SAAS,EAAE,IAAM;AAAEA,YAAAA;SAAU,CAAA,CAAA;IACrF,MAAM,EAAElB,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEkB,SAAS,EAAE,GAAGC,kBAAAA,EAAAA;AACtB,IAAA,MAAM,CAACC,gBAAAA,EAAkBC,mBAAAA,CAAoB,GAAGC,KAAAA,CAAMC,QAAQ,CAA2B,EAAE,CAAA;AAC3F,IAAA,MAAM,CAAC,EAAEtB,KAAK,EAAE,CAAC,GAAGC,cAAAA,EAAAA;IAEpB,OAAO;AACLC,QAAAA,QAAAA,EAAU,CAACc,SAAAA;AACXb,QAAAA,IAAAA,gBAAM9B,GAAA,CAACkD,eAAAA,EAAAA,EAAAA,CAAAA;AACPlC,QAAAA,KAAAA,EAAO3B,aAAAA,CAAc;YACnB4B,EAAAA,EAAI,qCAAA;YACJC,cAAAA,EAAgB;AAClB,SAAA,CAAA;QACAL,QAAAA,EAAU,WAAA;QACVmB,OAAAA,EAAS,UAAA;AACP,YAAA,IAAI,CAACjC,UAAAA,EAAY;AACfkC,gBAAAA,OAAAA,CAAQC,KAAK,CACX,uHAAA,CAAA;gBAGFT,kBAAAA,CAAmB;AACjBU,oBAAAA,OAAAA,EAAS9C,aAAAA,CAAc;wBACrB4B,EAAAA,EAAI,qCAAA;wBACJC,cAAAA,EAAgB;AAClB,qBAAA,CAAA;oBACAkB,IAAAA,EAAM;AACR,iBAAA,CAAA;AAEA,gBAAA;AACF,YAAA;YAEA,MAAMe,GAAAA,GAAM,MAAMP,SAAAA,CAAU;AAC1BrD,gBAAAA,KAAAA;gBACA6D,QAAAA,EAAUrD,UAAAA;gBACVsD,MAAAA,EAAQ1B,KAAAA,CAAMjC,OAAO,EAAE4D,IAAAA,EAAMD;AAC/B,aAAA,CAAA;AAEA,YAAA,IAAI,UAAUF,GAAAA,EAAK;gBACjB9B,QAAAA,CAAS;oBACPgB,QAAAA,EAAUc,GAAAA,CAAII,IAAI,CAACxD,UAAU;AAC7BuC,oBAAAA,MAAAA,EAAQC,SAAAA,CAAU;AAChB7C,wBAAAA,OAAAA,EAASiC,MAAMjC;AACjB,qBAAA;AACF,iBAAA,CAAA;AAEA;;AAEC,YACD,OAAO,IAAA;AACT,YAAA;AAEA,YAAA,IACE8D,gBAAAA,CAAiBL,GAAAA,CAAIjB,KAAK,CAAA,IAC1BiB,GAAAA,CAAIjB,KAAK,CAACuB,OAAO,IACjB,OAAON,GAAAA,CAAIjB,KAAK,CAACuB,OAAO,KAAK,QAAA,IAC7B,kBAAA,IAAsBN,GAAAA,CAAIjB,KAAK,CAACuB,OAAO,IACvC9C,KAAAA,CAAMC,OAAO,CAACuC,GAAAA,CAAIjB,KAAK,CAACuB,OAAO,CAACX,gBAAgB,CAAA,EAChD;AACA,gBAAA,MAAMA,mBAAmBK,GAAAA,CAAIjB,KAAK,CAACuB,OAAO,CAACX,gBAAgB;gBAE3DC,mBAAAA,CAAoBD,gBAAAA,CAAAA;AACtB,YAAA;AACF,QAAA,CAAA;QACAY,MAAAA,EAAQ;YACNtB,IAAAA,EAAM,OAAA;AACNuB,YAAAA,KAAAA,EAAOtE,aAAAA,CAAc;gBACnB4B,EAAAA,EAAI,uDAAA;gBACJC,cAAAA,EAAgB;AAClB,aAAA,CAAA;AACA0C,YAAAA,OAAAA,gBAAS5D,GAAA,CAAC6D,yBAAAA,EAAAA;gBAA0Bf,gBAAAA,EAAkBA;;YACtDgB,MAAAA,EAAQ,CAAC,EAAEC,OAAO,EAAE,GAAA;gBAClB,qBACEC,IAAA,CAACC,MAAMC,MAAM,EAAA;;sCACXlE,GAAA,CAACmE,MAAAA,EAAAA;4BAAOnC,OAAAA,EAAS+B,OAAAA;4BAAS5C,OAAAA,EAAQ,UAAA;sCAC/B9B,aAAAA,CAAc;gCACb4B,EAAAA,EAAI,QAAA;gCACJC,cAAAA,EAAgB;AAClB,6BAAA;;sCAEFlB,GAAA,CAACoE,UAAAA,EAAAA;4BACCC,GAAAA,EAAKC,OAAAA;4BACLC,EAAAA,EAAI;gCACFlC,QAAAA,EAAU,CAAC,MAAM,EAAEtC,UAAAA,CAAAA,CAAY;AAC/BuC,gCAAAA,MAAAA,EAAQC,SAAAA,CAAU;AAChB7C,oCAAAA,OAAAA,EAASiC,MAAMjC;AACjB,iCAAA;AACF,6BAAA;sCAECL,aAAAA,CAAc;gCACb4B,EAAAA,EAAI,uDAAA;gCACJC,cAAAA,EAAgB;AAClB,6BAAA;;;;AAIR,YAAA;AACF;AACF,KAAA;AACF,CAAA;AAEAwB,WAAAA,CAAYN,IAAI,GAAG,OAAA;AACnBM,WAAAA,CAAY7B,QAAQ,GAAG,WAAA;AAEvB;;;AAGC,IACD,MAAMqC,eAAAA,GAAkBV,MAAAA,CAAOgC,SAAAA,CAAU;;;;AAIzC,CAAC;AAED,MAAMC,yBAAAA,GAA4B;AAACrD,IAAAA,UAAAA;AAAYsB,IAAAA;AAAY;;;;"}
1
+ {"version":3,"file":"TableActions.mjs","sources":["../../../../../admin/src/pages/ListView/components/TableActions.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n DescriptionComponentRenderer,\n useNotification,\n useStrapiApp,\n useQueryParams,\n} from '@strapi/admin/strapi-admin';\nimport { Button, LinkButton, Modal } from '@strapi/design-system';\nimport { Duplicate, ExternalLink, Pencil } from '@strapi/icons';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { NavLink, useHref, useNavigate } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { useDocumentRBAC } from '../../../features/DocumentRBAC';\nimport { Document, useDoc } from '../../../hooks/useDocument';\nimport { useDocumentActions } from '../../../hooks/useDocumentActions';\nimport { isBaseQueryError } from '../../../utils/api';\nimport { DocumentActionsMenu } from '../../EditView/components/DocumentActions';\n\nimport { AutoCloneFailureModalBody } from './AutoCloneFailureModal';\n\nimport type { ProhibitedCloningField } from '../../../../../shared/contracts/collection-types';\nimport type {\n ContentManagerPlugin,\n DocumentActionComponent,\n DocumentActionProps,\n} from '../../../content-manager';\n\n/* -------------------------------------------------------------------------------------------------\n * TableActions\n * -----------------------------------------------------------------------------------------------*/\n\ninterface TableActionsProps {\n document: Document;\n}\n\nconst TableActions = ({ document }: TableActionsProps) => {\n const { formatMessage } = useIntl();\n const { model, collectionType } = useDoc();\n const plugins = useStrapiApp('TableActions', (state) => state.plugins);\n\n const props: DocumentActionProps = {\n activeTab: null,\n model,\n documentId: document.documentId,\n collectionType,\n document,\n };\n\n return (\n <DescriptionComponentRenderer\n props={props}\n descriptions={(plugins['content-manager'].apis as ContentManagerPlugin['config']['apis'])\n .getDocumentActions('table-row')\n // We explicitly remove the PublishAction from description so we never render it and we don't make unnecessary requests.\n .filter((action) => action.name !== 'PublishAction')}\n >\n {(actions) => {\n const tableRowActions = actions.filter((action) => {\n const positions = Array.isArray(action.position) ? action.position : [action.position];\n return positions.includes('table-row');\n });\n\n return (\n <DocumentActionsMenu\n actions={tableRowActions}\n label={formatMessage({\n id: 'content-manager.containers.list.table.row-actions',\n defaultMessage: 'Row actions',\n })}\n variant=\"ghost\"\n />\n );\n }}\n </DescriptionComponentRenderer>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * TableActionComponents\n * -----------------------------------------------------------------------------------------------*/\n\nconst EditAction: DocumentActionComponent = ({ documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('EditAction', ({ canRead }) => ({ canRead }));\n const { toggleNotification } = useNotification();\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n return {\n disabled: !canRead,\n icon: <StyledPencil />,\n label: formatMessage({\n id: 'content-manager.actions.edit.label',\n defaultMessage: 'Edit',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to edit a document without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.edit.error',\n defaultMessage: 'An error occurred while trying to edit the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n navigate({\n pathname: documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n },\n };\n};\n\nEditAction.type = 'edit';\nEditAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledPencil = styled(Pencil)`\n path {\n fill: currentColor;\n }\n`;\n\nconst OpenInNewTabAction: DocumentActionComponent = ({ documentId }) => {\n const { formatMessage } = useIntl();\n const { canRead } = useDocumentRBAC('OpenInNewTabAction', ({ canRead }) => ({ canRead }));\n const [{ query }] = useQueryParams<{ plugins?: object }>();\n\n // Resolve the entry's absolute URL (incl. router basename) so we can open it\n // in a real new browser tab. The primary list-view cell is also a link, this\n // gives the same affordance an explicit, discoverable menu entry.\n const href = useHref({\n pathname: documentId ?? '',\n search: stringify({ plugins: query.plugins }),\n });\n\n return {\n disabled: !canRead || !documentId,\n icon: <StyledExternalLink />,\n label: formatMessage({\n id: 'content-manager.actions.open-in-new-tab.label',\n defaultMessage: 'Open in new tab',\n }),\n position: 'table-row',\n onClick: () => {\n window.open(href, '_blank', 'noopener,noreferrer');\n },\n };\n};\n\n// No `type` is set: it's an optional discriminator constrained to a known union\n// and this action is identified by its component name instead.\nOpenInNewTabAction.position = 'table-row';\n\nconst StyledExternalLink = styled(ExternalLink)`\n path {\n fill: currentColor;\n }\n`;\n\nconst CloneAction: DocumentActionComponent = ({ model, documentId }) => {\n const navigate = useNavigate();\n const { formatMessage } = useIntl();\n const { canCreate } = useDocumentRBAC('CloneAction', ({ canCreate }) => ({ canCreate }));\n const { toggleNotification } = useNotification();\n const { autoClone } = useDocumentActions();\n const [prohibitedFields, setProhibitedFields] = React.useState<ProhibitedCloningField[]>([]);\n const [{ query }] = useQueryParams<{ plugins?: { i18n?: { locale?: string } } }>();\n\n return {\n disabled: !canCreate,\n icon: <StyledDuplicate />,\n label: formatMessage({\n id: 'content-manager.actions.clone.label',\n defaultMessage: 'Duplicate',\n }),\n position: 'table-row',\n onClick: async () => {\n if (!documentId) {\n console.error(\n \"You're trying to clone a document in the table without an id, this is likely a bug with Strapi. Please open an issue.\"\n );\n\n toggleNotification({\n message: formatMessage({\n id: 'content-manager.actions.clone.error',\n defaultMessage: 'An error occurred while trying to clone the document.',\n }),\n type: 'danger',\n });\n\n return;\n }\n\n const res = await autoClone({\n model,\n sourceId: documentId,\n locale: query.plugins?.i18n?.locale,\n });\n\n if ('data' in res) {\n navigate({\n pathname: res.data.documentId,\n search: stringify({\n plugins: query.plugins,\n }),\n });\n\n /**\n * We return true because we don't need to show a modal anymore.\n */\n return true;\n }\n\n if (\n isBaseQueryError(res.error) &&\n res.error.details &&\n typeof res.error.details === 'object' &&\n 'prohibitedFields' in res.error.details &&\n Array.isArray(res.error.details.prohibitedFields)\n ) {\n const prohibitedFields = res.error.details.prohibitedFields as ProhibitedCloningField[];\n\n setProhibitedFields(prohibitedFields);\n }\n },\n dialog: {\n type: 'modal',\n title: formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.header',\n defaultMessage: 'Duplicate',\n }),\n content: <AutoCloneFailureModalBody prohibitedFields={prohibitedFields} />,\n footer: ({ onClose }) => {\n return (\n <Modal.Footer>\n <Button onClick={onClose} variant=\"tertiary\">\n {formatMessage({\n id: 'cancel',\n defaultMessage: 'Cancel',\n })}\n </Button>\n <LinkButton\n tag={NavLink}\n to={{\n pathname: `clone/${documentId}`,\n search: stringify({\n plugins: query.plugins,\n }),\n }}\n >\n {formatMessage({\n id: 'content-manager.containers.list.autoCloneModal.create',\n defaultMessage: 'Create',\n })}\n </LinkButton>\n </Modal.Footer>\n );\n },\n },\n };\n};\n\nCloneAction.type = 'clone';\nCloneAction.position = 'table-row';\n\n/**\n * Because the icon system is completely broken, we have to do\n * this to remove the fill from the cog.\n */\nconst StyledDuplicate = styled(Duplicate)`\n path {\n fill: currentColor;\n }\n`;\n\nconst DEFAULT_TABLE_ROW_ACTIONS = [EditAction, OpenInNewTabAction, CloneAction];\n\nexport { TableActions, DEFAULT_TABLE_ROW_ACTIONS };\n"],"names":["TableActions","document","formatMessage","useIntl","model","collectionType","useDoc","plugins","useStrapiApp","state","props","activeTab","documentId","_jsx","DescriptionComponentRenderer","descriptions","apis","getDocumentActions","filter","action","name","actions","tableRowActions","positions","Array","isArray","position","includes","DocumentActionsMenu","label","id","defaultMessage","variant","EditAction","navigate","useNavigate","canRead","useDocumentRBAC","toggleNotification","useNotification","query","useQueryParams","disabled","icon","StyledPencil","onClick","console","error","message","type","pathname","search","stringify","styled","Pencil","OpenInNewTabAction","href","useHref","StyledExternalLink","window","open","ExternalLink","CloneAction","canCreate","autoClone","useDocumentActions","prohibitedFields","setProhibitedFields","React","useState","StyledDuplicate","res","sourceId","locale","i18n","data","isBaseQueryError","details","dialog","title","content","AutoCloneFailureModalBody","footer","onClose","_jsxs","Modal","Footer","Button","LinkButton","tag","NavLink","to","Duplicate","DEFAULT_TABLE_ROW_ACTIONS"],"mappings":"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"}
@@ -3,6 +3,7 @@
3
3
  var jsxRuntime = require('react/jsx-runtime');
4
4
  var designSystem = require('@strapi/design-system');
5
5
  var isEmpty = require('lodash/isEmpty');
6
+ var reactRouterDom = require('react-router-dom');
6
7
  var CellValue = require('./CellValue.js');
7
8
  var Components = require('./Components.js');
8
9
  var Media = require('./Media.js');
@@ -12,7 +13,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
12
13
 
13
14
  var isEmpty__default = /*#__PURE__*/_interopDefault(isEmpty);
14
15
 
15
- const CellContent = ({ content, mainField, attribute, rowId, name })=>{
16
+ const CellContent = ({ content, mainField, attribute, rowId, name, linkTo })=>{
16
17
  const isIdColumn = name === 'id';
17
18
  if (!hasContent(content, mainField, attribute)) {
18
19
  return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
@@ -22,6 +23,29 @@ const CellContent = ({ content, mainField, attribute, rowId, name })=>{
22
23
  children: "-"
23
24
  });
24
25
  }
26
+ // Primary scalar column: render the value as a link to the entry so it gets
27
+ // native open-in-new-tab semantics. stopPropagation prevents the row's own
28
+ // onClick from firing a second navigation; React Router's Link still handles
29
+ // the click (stopPropagation does not preventDefault).
30
+ if (linkTo) {
31
+ const link = /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
32
+ tag: reactRouterDom.Link,
33
+ to: linkTo,
34
+ onClick: (e)=>e.stopPropagation(),
35
+ maxWidth: "30rem",
36
+ ellipsis: true,
37
+ textColor: "neutral800",
38
+ children: /*#__PURE__*/ jsxRuntime.jsx(CellValue.CellValue, {
39
+ isIdColumn: isIdColumn,
40
+ type: attribute.type,
41
+ value: content
42
+ })
43
+ });
44
+ return attribute.type === 'string' ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Tooltip, {
45
+ label: content,
46
+ children: link
47
+ }) : link;
48
+ }
25
49
  switch(attribute.type){
26
50
  case 'media':
27
51
  if (!attribute.multiple) {
@@ -134,4 +158,5 @@ const isSingleRelation = (type)=>[
134
158
  ].includes(type);
135
159
 
136
160
  exports.CellContent = CellContent;
161
+ exports.hasContent = hasContent;
137
162
  //# sourceMappingURL=CellContent.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"CellContent.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/CellContent.tsx"],"sourcesContent":["import { Tooltip, Typography } from '@strapi/design-system';\nimport isEmpty from 'lodash/isEmpty';\n\nimport { CellValue } from './CellValue';\nimport { SingleComponent, RepeatableComponent } from './Components';\nimport { MediaSingle, MediaMultiple } from './Media';\nimport { RelationMultiple, RelationSingle } from './Relations';\n\nimport type { ListFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport type { Schema, Data } from '@strapi/types';\n\ninterface CellContentProps extends Omit<ListFieldLayout, 'cellFormatter'> {\n content: Schema.Attribute.Value<Schema.Attribute.AnyAttribute>;\n rowId: Data.ID;\n}\n\nconst CellContent = ({ content, mainField, attribute, rowId, name }: CellContentProps) => {\n const isIdColumn = name === 'id';\n\n if (!hasContent(content, mainField, attribute)) {\n return (\n <Typography\n textColor=\"neutral800\"\n paddingLeft={attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0}\n paddingRight={\n attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0\n }\n >\n -\n </Typography>\n );\n }\n\n switch (attribute.type) {\n case 'media':\n if (!attribute.multiple) {\n return <MediaSingle {...content} />;\n }\n\n return <MediaMultiple content={content} />;\n\n case 'relation': {\n if (isSingleRelation(attribute.relation)) {\n return <RelationSingle mainField={mainField} content={content} />;\n }\n\n return <RelationMultiple rowId={rowId} mainField={mainField} content={content} name={name} />;\n }\n\n case 'component':\n if (attribute.repeatable) {\n return <RepeatableComponent mainField={mainField} content={content} />;\n }\n\n return <SingleComponent mainField={mainField} content={content} />;\n\n case 'string':\n return (\n <Tooltip label={content}>\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n </Tooltip>\n );\n\n default:\n return (\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n );\n }\n};\n\nconst hasContent = (\n content: CellContentProps['content'],\n mainField: CellContentProps['mainField'],\n attribute: CellContentProps['attribute']\n) => {\n if (attribute.type === 'component') {\n // Repeatable fields show the ID as fallback, in case the mainField\n // doesn't have any content\n if (attribute.repeatable || !mainField) {\n return content?.length > 0;\n }\n\n const value = content?.[mainField.name];\n\n // relations, media ... show the id as fallback\n if (mainField.name === 'id' && ![undefined, null].includes(value)) {\n return true;\n }\n\n return !isEmpty(value);\n }\n\n if (attribute.type === 'relation') {\n if (isSingleRelation(attribute.relation)) {\n return !isEmpty(content);\n }\n\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n\n return content?.count > 0;\n }\n\n /*\n Biginteger fields need to be treated as strings, as `isNumber`\n doesn't deal with them.\n */\n if (['integer', 'decimal', 'float', 'number'].includes(attribute.type)) {\n return typeof content === 'number';\n }\n\n if (attribute.type === 'boolean') {\n return content !== null;\n }\n\n return !isEmpty(content);\n};\n\nconst isSingleRelation = (\n type: Extract<CellContentProps['attribute'], { type: 'relation' }>['relation']\n) => ['oneToOne', 'manyToOne', 'oneToOneMorph'].includes(type);\n\nexport { CellContent };\nexport type { CellContentProps };\n"],"names":["CellContent","content","mainField","attribute","rowId","name","isIdColumn","hasContent","_jsx","Typography","textColor","paddingLeft","type","paddingRight","multiple","MediaSingle","MediaMultiple","isSingleRelation","relation","RelationSingle","RelationMultiple","repeatable","RepeatableComponent","SingleComponent","Tooltip","label","maxWidth","ellipsis","CellValue","value","length","undefined","includes","isEmpty","Array","isArray","count"],"mappings":"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"}
1
+ {"version":3,"file":"CellContent.js","sources":["../../../../../../admin/src/pages/ListView/components/TableCells/CellContent.tsx"],"sourcesContent":["import type { MouseEvent } from 'react';\n\nimport { Tooltip, Typography } from '@strapi/design-system';\nimport isEmpty from 'lodash/isEmpty';\nimport { Link as ReactRouterLink } from 'react-router-dom';\n\nimport { CellValue } from './CellValue';\nimport { SingleComponent, RepeatableComponent } from './Components';\nimport { MediaSingle, MediaMultiple } from './Media';\nimport { RelationMultiple, RelationSingle } from './Relations';\n\nimport type { ListFieldLayout } from '../../../../hooks/useDocumentLayout';\nimport type { Schema, Data } from '@strapi/types';\nimport type { To } from 'react-router-dom';\n\ninterface CellContentProps extends Omit<ListFieldLayout, 'cellFormatter'> {\n content: Schema.Attribute.Value<Schema.Attribute.AnyAttribute>;\n rowId: Data.ID;\n /**\n * When set, the cell renders its value as a navigational link to the entry.\n * Used for the primary (first scalar) column so users can open an entry in a\n * new tab via right-click / cmd+click / middle-click, while a plain click\n * still navigates within the SPA. Only passed for non-interactive cell types.\n */\n linkTo?: To;\n}\n\nconst CellContent = ({ content, mainField, attribute, rowId, name, linkTo }: CellContentProps) => {\n const isIdColumn = name === 'id';\n\n if (!hasContent(content, mainField, attribute)) {\n return (\n <Typography\n textColor=\"neutral800\"\n paddingLeft={attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0}\n paddingRight={\n attribute.type === 'relation' || attribute.type === 'component' ? '1.6rem' : 0\n }\n >\n -\n </Typography>\n );\n }\n\n // Primary scalar column: render the value as a link to the entry so it gets\n // native open-in-new-tab semantics. stopPropagation prevents the row's own\n // onClick from firing a second navigation; React Router's Link still handles\n // the click (stopPropagation does not preventDefault).\n if (linkTo) {\n const link = (\n <Typography\n tag={ReactRouterLink}\n to={linkTo}\n onClick={(e: MouseEvent) => e.stopPropagation()}\n maxWidth=\"30rem\"\n ellipsis\n textColor=\"neutral800\"\n >\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n );\n\n return attribute.type === 'string' ? <Tooltip label={content}>{link}</Tooltip> : link;\n }\n\n switch (attribute.type) {\n case 'media':\n if (!attribute.multiple) {\n return <MediaSingle {...content} />;\n }\n\n return <MediaMultiple content={content} />;\n\n case 'relation': {\n if (isSingleRelation(attribute.relation)) {\n return <RelationSingle mainField={mainField} content={content} />;\n }\n\n return <RelationMultiple rowId={rowId} mainField={mainField} content={content} name={name} />;\n }\n\n case 'component':\n if (attribute.repeatable) {\n return <RepeatableComponent mainField={mainField} content={content} />;\n }\n\n return <SingleComponent mainField={mainField} content={content} />;\n\n case 'string':\n return (\n <Tooltip label={content}>\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n </Tooltip>\n );\n\n default:\n return (\n <Typography maxWidth=\"30rem\" ellipsis textColor=\"neutral800\">\n <CellValue isIdColumn={isIdColumn} type={attribute.type} value={content} />\n </Typography>\n );\n }\n};\n\nconst hasContent = (\n content: CellContentProps['content'],\n mainField: CellContentProps['mainField'],\n attribute: CellContentProps['attribute']\n) => {\n if (attribute.type === 'component') {\n // Repeatable fields show the ID as fallback, in case the mainField\n // doesn't have any content\n if (attribute.repeatable || !mainField) {\n return content?.length > 0;\n }\n\n const value = content?.[mainField.name];\n\n // relations, media ... show the id as fallback\n if (mainField.name === 'id' && ![undefined, null].includes(value)) {\n return true;\n }\n\n return !isEmpty(value);\n }\n\n if (attribute.type === 'relation') {\n if (isSingleRelation(attribute.relation)) {\n return !isEmpty(content);\n }\n\n if (Array.isArray(content)) {\n return content.length > 0;\n }\n\n return content?.count > 0;\n }\n\n /*\n Biginteger fields need to be treated as strings, as `isNumber`\n doesn't deal with them.\n */\n if (['integer', 'decimal', 'float', 'number'].includes(attribute.type)) {\n return typeof content === 'number';\n }\n\n if (attribute.type === 'boolean') {\n return content !== null;\n }\n\n return !isEmpty(content);\n};\n\nconst isSingleRelation = (\n type: Extract<CellContentProps['attribute'], { type: 'relation' }>['relation']\n) => ['oneToOne', 'manyToOne', 'oneToOneMorph'].includes(type);\n\nexport { CellContent, hasContent };\nexport type { CellContentProps };\n"],"names":["CellContent","content","mainField","attribute","rowId","name","linkTo","isIdColumn","hasContent","_jsx","Typography","textColor","paddingLeft","type","paddingRight","link","tag","ReactRouterLink","to","onClick","e","stopPropagation","maxWidth","ellipsis","CellValue","value","Tooltip","label","multiple","MediaSingle","MediaMultiple","isSingleRelation","relation","RelationSingle","RelationMultiple","repeatable","RepeatableComponent","SingleComponent","length","undefined","includes","isEmpty","Array","isArray","count"],"mappings":";;;;;;;;;;;;;;;AA2BA,MAAMA,WAAAA,GAAc,CAAC,EAAEC,OAAO,EAAEC,SAAS,EAAEC,SAAS,EAAEC,KAAK,EAAEC,IAAI,EAAEC,MAAM,EAAoB,GAAA;AAC3F,IAAA,MAAMC,aAAaF,IAAAA,KAAS,IAAA;AAE5B,IAAA,IAAI,CAACG,UAAAA,CAAWP,OAAAA,EAASC,SAAAA,EAAWC,SAAAA,CAAAA,EAAY;AAC9C,QAAA,qBACEM,cAAA,CAACC,uBAAAA,EAAAA;YACCC,SAAAA,EAAU,YAAA;YACVC,WAAAA,EAAaT,SAAAA,CAAUU,IAAI,KAAK,UAAA,IAAcV,UAAUU,IAAI,KAAK,cAAc,QAAA,GAAW,CAAA;YAC1FC,YAAAA,EACEX,SAAAA,CAAUU,IAAI,KAAK,UAAA,IAAcV,UAAUU,IAAI,KAAK,cAAc,QAAA,GAAW,CAAA;AAEhF,YAAA,QAAA,EAAA;;AAIL,IAAA;;;;;AAMA,IAAA,IAAIP,MAAAA,EAAQ;AACV,QAAA,MAAMS,qBACJN,cAAA,CAACC,uBAAAA,EAAAA;YACCM,GAAAA,EAAKC,mBAAAA;YACLC,EAAAA,EAAIZ,MAAAA;YACJa,OAAAA,EAAS,CAACC,CAAAA,GAAkBA,CAAAA,CAAEC,eAAe,EAAA;YAC7CC,QAAAA,EAAS,OAAA;YACTC,QAAQ,EAAA,IAAA;YACRZ,SAAAA,EAAU,YAAA;AAEV,YAAA,QAAA,gBAAAF,cAAA,CAACe,mBAAAA,EAAAA;gBAAUjB,UAAAA,EAAYA,UAAAA;AAAYM,gBAAAA,IAAAA,EAAMV,UAAUU,IAAI;gBAAEY,KAAAA,EAAOxB;;;AAIpE,QAAA,OAAOE,SAAAA,CAAUU,IAAI,KAAK,QAAA,iBAAWJ,cAAA,CAACiB,oBAAAA,EAAAA;YAAQC,KAAAA,EAAO1B,OAAAA;AAAUc,YAAAA,QAAAA,EAAAA;AAAkBA,SAAAA,CAAAA,GAAAA,IAAAA;AACnF,IAAA;AAEA,IAAA,OAAQZ,UAAUU,IAAI;QACpB,KAAK,OAAA;YACH,IAAI,CAACV,SAAAA,CAAUyB,QAAQ,EAAE;AACvB,gBAAA,qBAAOnB,cAAA,CAACoB,iBAAAA,EAAAA;AAAa,oBAAA,GAAG5B;;AAC1B,YAAA;AAEA,YAAA,qBAAOQ,cAAA,CAACqB,mBAAAA,EAAAA;gBAAc7B,OAAAA,EAASA;;QAEjC,KAAK,UAAA;AAAY,YAAA;gBACf,IAAI8B,gBAAAA,CAAiB5B,SAAAA,CAAU6B,QAAQ,CAAA,EAAG;AACxC,oBAAA,qBAAOvB,cAAA,CAACwB,wBAAAA,EAAAA;wBAAe/B,SAAAA,EAAWA,SAAAA;wBAAWD,OAAAA,EAASA;;AACxD,gBAAA;AAEA,gBAAA,qBAAOQ,cAAA,CAACyB,0BAAAA,EAAAA;oBAAiB9B,KAAAA,EAAOA,KAAAA;oBAAOF,SAAAA,EAAWA,SAAAA;oBAAWD,OAAAA,EAASA,OAAAA;oBAASI,IAAAA,EAAMA;;AACvF,YAAA;QAEA,KAAK,WAAA;YACH,IAAIF,SAAAA,CAAUgC,UAAU,EAAE;AACxB,gBAAA,qBAAO1B,cAAA,CAAC2B,8BAAAA,EAAAA;oBAAoBlC,SAAAA,EAAWA,SAAAA;oBAAWD,OAAAA,EAASA;;AAC7D,YAAA;AAEA,YAAA,qBAAOQ,cAAA,CAAC4B,0BAAAA,EAAAA;gBAAgBnC,SAAAA,EAAWA,SAAAA;gBAAWD,OAAAA,EAASA;;QAEzD,KAAK,QAAA;AACH,YAAA,qBACEQ,cAAA,CAACiB,oBAAAA,EAAAA;gBAAQC,KAAAA,EAAO1B,OAAAA;AACd,gBAAA,QAAA,gBAAAQ,cAAA,CAACC,uBAAAA,EAAAA;oBAAWY,QAAAA,EAAS,OAAA;oBAAQC,QAAQ,EAAA,IAAA;oBAACZ,SAAAA,EAAU,YAAA;AAC9C,oBAAA,QAAA,gBAAAF,cAAA,CAACe,mBAAAA,EAAAA;wBAAUjB,UAAAA,EAAYA,UAAAA;AAAYM,wBAAAA,IAAAA,EAAMV,UAAUU,IAAI;wBAAEY,KAAAA,EAAOxB;;;;AAKxE,QAAA;AACE,YAAA,qBACEQ,cAAA,CAACC,uBAAAA,EAAAA;gBAAWY,QAAAA,EAAS,OAAA;gBAAQC,QAAQ,EAAA,IAAA;gBAACZ,SAAAA,EAAU,YAAA;AAC9C,gBAAA,QAAA,gBAAAF,cAAA,CAACe,mBAAAA,EAAAA;oBAAUjB,UAAAA,EAAYA,UAAAA;AAAYM,oBAAAA,IAAAA,EAAMV,UAAUU,IAAI;oBAAEY,KAAAA,EAAOxB;;;AAGxE;AACF;AAEA,MAAMO,UAAAA,GAAa,CACjBP,OAAAA,EACAC,SAAAA,EACAC,SAAAA,GAAAA;IAEA,IAAIA,SAAAA,CAAUU,IAAI,KAAK,WAAA,EAAa;;;AAGlC,QAAA,IAAIV,SAAAA,CAAUgC,UAAU,IAAI,CAACjC,SAAAA,EAAW;AACtC,YAAA,OAAOD,SAASqC,MAAAA,GAAS,CAAA;AAC3B,QAAA;AAEA,QAAA,MAAMb,KAAAA,GAAQxB,OAAAA,GAAUC,SAAAA,CAAUG,IAAI,CAAC;;AAGvC,QAAA,IAAIH,SAAAA,CAAUG,IAAI,KAAK,IAAA,IAAQ,CAAC;AAACkC,YAAAA,SAAAA;AAAW,YAAA;SAAK,CAACC,QAAQ,CAACf,KAAAA,CAAAA,EAAQ;YACjE,OAAO,IAAA;AACT,QAAA;AAEA,QAAA,OAAO,CAACgB,wBAAAA,CAAQhB,KAAAA,CAAAA;AAClB,IAAA;IAEA,IAAItB,SAAAA,CAAUU,IAAI,KAAK,UAAA,EAAY;QACjC,IAAIkB,gBAAAA,CAAiB5B,SAAAA,CAAU6B,QAAQ,CAAA,EAAG;AACxC,YAAA,OAAO,CAACS,wBAAAA,CAAQxC,OAAAA,CAAAA;AAClB,QAAA;QAEA,IAAIyC,KAAAA,CAAMC,OAAO,CAAC1C,OAAAA,CAAAA,EAAU;YAC1B,OAAOA,OAAAA,CAAQqC,MAAM,GAAG,CAAA;AAC1B,QAAA;AAEA,QAAA,OAAOrC,SAAS2C,KAAAA,GAAQ,CAAA;AAC1B,IAAA;AAEA;;;AAGA,KACA,IAAI;AAAC,QAAA,SAAA;AAAW,QAAA,SAAA;AAAW,QAAA,OAAA;AAAS,QAAA;AAAS,KAAA,CAACJ,QAAQ,CAACrC,SAAAA,CAAUU,IAAI,CAAA,EAAG;AACtE,QAAA,OAAO,OAAOZ,OAAAA,KAAY,QAAA;AAC5B,IAAA;IAEA,IAAIE,SAAAA,CAAUU,IAAI,KAAK,SAAA,EAAW;AAChC,QAAA,OAAOZ,OAAAA,KAAY,IAAA;AACrB,IAAA;AAEA,IAAA,OAAO,CAACwC,wBAAAA,CAAQxC,OAAAA,CAAAA;AAClB;AAEA,MAAM8B,gBAAAA,GAAmB,CACvBlB,IAAAA,GACG;AAAC,QAAA,UAAA;AAAY,QAAA,WAAA;AAAa,QAAA;AAAgB,KAAA,CAAC2B,QAAQ,CAAC3B,IAAAA,CAAAA;;;;;"}
@@ -1,12 +1,13 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
  import { Typography, Tooltip } from '@strapi/design-system';
3
3
  import isEmpty from 'lodash/isEmpty';
4
+ import { Link } from 'react-router-dom';
4
5
  import { CellValue } from './CellValue.mjs';
5
6
  import { RepeatableComponent, SingleComponent } from './Components.mjs';
6
7
  import { MediaSingle, MediaMultiple } from './Media.mjs';
7
8
  import { RelationSingle, RelationMultiple } from './Relations.mjs';
8
9
 
9
- const CellContent = ({ content, mainField, attribute, rowId, name })=>{
10
+ const CellContent = ({ content, mainField, attribute, rowId, name, linkTo })=>{
10
11
  const isIdColumn = name === 'id';
11
12
  if (!hasContent(content, mainField, attribute)) {
12
13
  return /*#__PURE__*/ jsx(Typography, {
@@ -16,6 +17,29 @@ const CellContent = ({ content, mainField, attribute, rowId, name })=>{
16
17
  children: "-"
17
18
  });
18
19
  }
20
+ // Primary scalar column: render the value as a link to the entry so it gets
21
+ // native open-in-new-tab semantics. stopPropagation prevents the row's own
22
+ // onClick from firing a second navigation; React Router's Link still handles
23
+ // the click (stopPropagation does not preventDefault).
24
+ if (linkTo) {
25
+ const link = /*#__PURE__*/ jsx(Typography, {
26
+ tag: Link,
27
+ to: linkTo,
28
+ onClick: (e)=>e.stopPropagation(),
29
+ maxWidth: "30rem",
30
+ ellipsis: true,
31
+ textColor: "neutral800",
32
+ children: /*#__PURE__*/ jsx(CellValue, {
33
+ isIdColumn: isIdColumn,
34
+ type: attribute.type,
35
+ value: content
36
+ })
37
+ });
38
+ return attribute.type === 'string' ? /*#__PURE__*/ jsx(Tooltip, {
39
+ label: content,
40
+ children: link
41
+ }) : link;
42
+ }
19
43
  switch(attribute.type){
20
44
  case 'media':
21
45
  if (!attribute.multiple) {
@@ -127,5 +151,5 @@ const isSingleRelation = (type)=>[
127
151
  'oneToOneMorph'
128
152
  ].includes(type);
129
153
 
130
- export { CellContent };
154
+ export { CellContent, hasContent };
131
155
  //# sourceMappingURL=CellContent.mjs.map