@strapi/content-manager 5.59.0 → 5.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (300) hide show
  1. package/dist/admin/constants/customOrder.js +14 -0
  2. package/dist/admin/constants/customOrder.js.map +1 -0
  3. package/dist/admin/constants/customOrder.mjs +10 -0
  4. package/dist/admin/constants/customOrder.mjs.map +1 -0
  5. package/dist/admin/history/components/VersionInputRenderer.js +2 -1
  6. package/dist/admin/history/components/VersionInputRenderer.js.map +1 -1
  7. package/dist/admin/history/components/VersionInputRenderer.mjs +2 -1
  8. package/dist/admin/history/components/VersionInputRenderer.mjs.map +1 -1
  9. package/dist/admin/hooks/useDocument.js +22 -11
  10. package/dist/admin/hooks/useDocument.js.map +1 -1
  11. package/dist/admin/hooks/useDocument.mjs +22 -11
  12. package/dist/admin/hooks/useDocument.mjs.map +1 -1
  13. package/dist/admin/hooks/useDocumentLayout.js.map +1 -1
  14. package/dist/admin/hooks/useDocumentLayout.mjs.map +1 -1
  15. package/dist/admin/hooks/useHasBeenNearViewport.js +70 -0
  16. package/dist/admin/hooks/useHasBeenNearViewport.js.map +1 -0
  17. package/dist/admin/hooks/useHasBeenNearViewport.mjs +46 -0
  18. package/dist/admin/hooks/useHasBeenNearViewport.mjs.map +1 -0
  19. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js +102 -32
  20. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.js.map +1 -1
  21. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs +104 -35
  22. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.mjs.map +1 -1
  23. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js +20 -17
  24. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.js.map +1 -1
  25. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs +20 -17
  26. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/Blocks/List.mjs.map +1 -1
  27. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js +15 -1
  28. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.js.map +1 -1
  29. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs +17 -3
  30. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/BlocksContent.mjs.map +1 -1
  31. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js +21 -0
  32. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.js.map +1 -1
  33. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs +22 -1
  34. package/dist/admin/pages/EditView/components/FormInputs/BlocksInput/plugins/withStrapiSchema.mjs.map +1 -1
  35. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js +1 -0
  36. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.js.map +1 -1
  37. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs +1 -0
  38. package/dist/admin/pages/EditView/components/FormInputs/Component/NonRepeatable.mjs.map +1 -1
  39. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js +1 -0
  40. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.js.map +1 -1
  41. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs +1 -0
  42. package/dist/admin/pages/EditView/components/FormInputs/Component/Repeatable.mjs.map +1 -1
  43. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js +2 -0
  44. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.js.map +1 -1
  45. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs +2 -0
  46. package/dist/admin/pages/EditView/components/FormInputs/DynamicZone/DynamicComponent.mjs.map +1 -1
  47. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js +4 -7
  48. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.js.map +1 -1
  49. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs +4 -7
  50. package/dist/admin/pages/EditView/components/FormInputs/Relations/RelationModal.mjs.map +1 -1
  51. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js +46 -10
  52. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.js.map +1 -1
  53. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs +47 -11
  54. package/dist/admin/pages/EditView/components/FormInputs/Relations/Relations.mjs.map +1 -1
  55. package/dist/admin/pages/EditView/components/FormLayout.js +201 -50
  56. package/dist/admin/pages/EditView/components/FormLayout.js.map +1 -1
  57. package/dist/admin/pages/EditView/components/FormLayout.mjs +202 -52
  58. package/dist/admin/pages/EditView/components/FormLayout.mjs.map +1 -1
  59. package/dist/admin/pages/EditView/components/InputRenderer.js +3 -1
  60. package/dist/admin/pages/EditView/components/InputRenderer.js.map +1 -1
  61. package/dist/admin/pages/EditView/components/InputRenderer.mjs +3 -1
  62. package/dist/admin/pages/EditView/components/InputRenderer.mjs.map +1 -1
  63. package/dist/admin/pages/ListConfiguration/components/Settings.js +31 -2
  64. package/dist/admin/pages/ListConfiguration/components/Settings.js.map +1 -1
  65. package/dist/admin/pages/ListConfiguration/components/Settings.mjs +31 -2
  66. package/dist/admin/pages/ListConfiguration/components/Settings.mjs.map +1 -1
  67. package/dist/admin/pages/ListView/ListViewPage.js +196 -132
  68. package/dist/admin/pages/ListView/ListViewPage.js.map +1 -1
  69. package/dist/admin/pages/ListView/ListViewPage.mjs +196 -132
  70. package/dist/admin/pages/ListView/ListViewPage.mjs.map +1 -1
  71. package/dist/admin/pages/ListView/components/CustomOrder.js +571 -0
  72. package/dist/admin/pages/ListView/components/CustomOrder.js.map +1 -0
  73. package/dist/admin/pages/ListView/components/CustomOrder.mjs +546 -0
  74. package/dist/admin/pages/ListView/components/CustomOrder.mjs.map +1 -0
  75. package/dist/admin/pages/ListView/components/TableActions.js +4 -1
  76. package/dist/admin/pages/ListView/components/TableActions.js.map +1 -1
  77. package/dist/admin/pages/ListView/components/TableActions.mjs +4 -1
  78. package/dist/admin/pages/ListView/components/TableActions.mjs.map +1 -1
  79. package/dist/admin/preview/components/PreviewSidePanel.js +2 -1
  80. package/dist/admin/preview/components/PreviewSidePanel.js.map +1 -1
  81. package/dist/admin/preview/components/PreviewSidePanel.mjs +2 -1
  82. package/dist/admin/preview/components/PreviewSidePanel.mjs.map +1 -1
  83. package/dist/admin/preview/utils/getPreviewUrlStatus.js +17 -0
  84. package/dist/admin/preview/utils/getPreviewUrlStatus.js.map +1 -0
  85. package/dist/admin/preview/utils/getPreviewUrlStatus.mjs +15 -0
  86. package/dist/admin/preview/utils/getPreviewUrlStatus.mjs.map +1 -0
  87. package/dist/admin/services/documents.js +22 -1
  88. package/dist/admin/services/documents.js.map +1 -1
  89. package/dist/admin/services/documents.mjs +21 -2
  90. package/dist/admin/services/documents.mjs.map +1 -1
  91. package/dist/admin/src/constants/customOrder.d.ts +8 -0
  92. package/dist/admin/src/exports.d.ts +1 -1
  93. package/dist/admin/src/history/components/VersionInputRenderer.d.ts +3 -1
  94. package/dist/admin/src/hooks/useDocument.d.ts +4 -0
  95. package/dist/admin/src/hooks/useDocumentLayout.d.ts +6 -2
  96. package/dist/admin/src/hooks/useHasBeenNearViewport.d.ts +13 -0
  97. package/dist/admin/src/pages/EditView/components/FormInputs/BlocksInput/Blocks/Image.d.ts +13 -1
  98. package/dist/admin/src/pages/EditView/components/FormLayout.d.ts +11 -1
  99. package/dist/admin/src/pages/EditView/components/InputRenderer.d.ts +2 -0
  100. package/dist/admin/src/pages/ListView/components/CustomOrder.d.ts +72 -0
  101. package/dist/admin/src/preview/utils/getPreviewUrlStatus.d.ts +6 -0
  102. package/dist/admin/src/services/documents.d.ts +10 -2
  103. package/dist/admin/translations/en.json.js +9 -0
  104. package/dist/admin/translations/en.json.js.map +1 -1
  105. package/dist/admin/translations/en.json.mjs +9 -0
  106. package/dist/admin/translations/en.json.mjs.map +1 -1
  107. package/dist/server/audit-logs.js +36 -0
  108. package/dist/server/audit-logs.js.map +1 -0
  109. package/dist/server/audit-logs.mjs +33 -0
  110. package/dist/server/audit-logs.mjs.map +1 -0
  111. package/dist/server/bootstrap.js +8 -0
  112. package/dist/server/bootstrap.js.map +1 -1
  113. package/dist/server/bootstrap.mjs +8 -0
  114. package/dist/server/bootstrap.mjs.map +1 -1
  115. package/dist/server/controllers/collection-types.js +8 -0
  116. package/dist/server/controllers/collection-types.js.map +1 -1
  117. package/dist/server/controllers/collection-types.mjs +8 -0
  118. package/dist/server/controllers/collection-types.mjs.map +1 -1
  119. package/dist/server/controllers/content-types.js +15 -0
  120. package/dist/server/controllers/content-types.js.map +1 -1
  121. package/dist/server/controllers/content-types.mjs +16 -1
  122. package/dist/server/controllers/content-types.mjs.map +1 -1
  123. package/dist/server/controllers/index.js +3 -1
  124. package/dist/server/controllers/index.js.map +1 -1
  125. package/dist/server/controllers/index.mjs +2 -0
  126. package/dist/server/controllers/index.mjs.map +1 -1
  127. package/dist/server/controllers/relations.js +53 -17
  128. package/dist/server/controllers/relations.js.map +1 -1
  129. package/dist/server/controllers/relations.mjs +54 -18
  130. package/dist/server/controllers/relations.mjs.map +1 -1
  131. package/dist/server/controllers/single-types.js +10 -1
  132. package/dist/server/controllers/single-types.js.map +1 -1
  133. package/dist/server/controllers/single-types.mjs +10 -1
  134. package/dist/server/controllers/single-types.mjs.map +1 -1
  135. package/dist/server/controllers/validation/model-configuration.js +2 -1
  136. package/dist/server/controllers/validation/model-configuration.js.map +1 -1
  137. package/dist/server/controllers/validation/model-configuration.mjs +2 -1
  138. package/dist/server/controllers/validation/model-configuration.mjs.map +1 -1
  139. package/dist/server/custom-order/constants.js +21 -0
  140. package/dist/server/custom-order/constants.js.map +1 -0
  141. package/dist/server/custom-order/constants.mjs +17 -0
  142. package/dist/server/custom-order/constants.mjs.map +1 -0
  143. package/dist/server/custom-order/controllers/custom-order.js +77 -0
  144. package/dist/server/custom-order/controllers/custom-order.js.map +1 -0
  145. package/dist/server/custom-order/controllers/custom-order.mjs +75 -0
  146. package/dist/server/custom-order/controllers/custom-order.mjs.map +1 -0
  147. package/dist/server/custom-order/controllers/index.js +10 -0
  148. package/dist/server/custom-order/controllers/index.js.map +1 -0
  149. package/dist/server/custom-order/controllers/index.mjs +8 -0
  150. package/dist/server/custom-order/controllers/index.mjs.map +1 -0
  151. package/dist/server/custom-order/index.js +71 -0
  152. package/dist/server/custom-order/index.js.map +1 -0
  153. package/dist/server/custom-order/index.mjs +69 -0
  154. package/dist/server/custom-order/index.mjs.map +1 -0
  155. package/dist/server/custom-order/routes/custom-order.js +38 -0
  156. package/dist/server/custom-order/routes/custom-order.js.map +1 -0
  157. package/dist/server/custom-order/routes/custom-order.mjs +36 -0
  158. package/dist/server/custom-order/routes/custom-order.mjs.map +1 -0
  159. package/dist/server/custom-order/routes/index.js +13 -0
  160. package/dist/server/custom-order/routes/index.js.map +1 -0
  161. package/dist/server/custom-order/routes/index.mjs +11 -0
  162. package/dist/server/custom-order/routes/index.mjs.map +1 -0
  163. package/dist/server/custom-order/services/custom-order.js +286 -0
  164. package/dist/server/custom-order/services/custom-order.js.map +1 -0
  165. package/dist/server/custom-order/services/custom-order.mjs +284 -0
  166. package/dist/server/custom-order/services/custom-order.mjs.map +1 -0
  167. package/dist/server/custom-order/services/document-middleware.js +83 -0
  168. package/dist/server/custom-order/services/document-middleware.js.map +1 -0
  169. package/dist/server/custom-order/services/document-middleware.mjs +81 -0
  170. package/dist/server/custom-order/services/document-middleware.mjs.map +1 -0
  171. package/dist/server/custom-order/services/index.js +10 -0
  172. package/dist/server/custom-order/services/index.js.map +1 -0
  173. package/dist/server/custom-order/services/index.mjs +8 -0
  174. package/dist/server/custom-order/services/index.mjs.map +1 -0
  175. package/dist/server/custom-order/services/utils.js +152 -0
  176. package/dist/server/custom-order/services/utils.js.map +1 -0
  177. package/dist/server/custom-order/services/utils.mjs +148 -0
  178. package/dist/server/custom-order/services/utils.mjs.map +1 -0
  179. package/dist/server/custom-order/utils.js +13 -0
  180. package/dist/server/custom-order/utils.js.map +1 -0
  181. package/dist/server/custom-order/utils.mjs +10 -0
  182. package/dist/server/custom-order/utils.mjs.map +1 -0
  183. package/dist/server/history/constants.js +2 -1
  184. package/dist/server/history/constants.js.map +1 -1
  185. package/dist/server/history/constants.mjs +2 -1
  186. package/dist/server/history/constants.mjs.map +1 -1
  187. package/dist/server/history/controllers/history-version.js +6 -2
  188. package/dist/server/history/controllers/history-version.js.map +1 -1
  189. package/dist/server/history/controllers/history-version.mjs +6 -2
  190. package/dist/server/history/controllers/history-version.mjs.map +1 -1
  191. package/dist/server/history/services/history.js +24 -7
  192. package/dist/server/history/services/history.js.map +1 -1
  193. package/dist/server/history/services/history.mjs +25 -8
  194. package/dist/server/history/services/history.mjs.map +1 -1
  195. package/dist/server/history/services/lifecycles.js +2 -16
  196. package/dist/server/history/services/lifecycles.js.map +1 -1
  197. package/dist/server/history/services/lifecycles.mjs +2 -16
  198. package/dist/server/history/services/lifecycles.mjs.map +1 -1
  199. package/dist/server/mcp/schemas/filters-schema.js +10 -2
  200. package/dist/server/mcp/schemas/filters-schema.js.map +1 -1
  201. package/dist/server/mcp/schemas/filters-schema.mjs +10 -2
  202. package/dist/server/mcp/schemas/filters-schema.mjs.map +1 -1
  203. package/dist/server/preview/controllers/validation/preview.js +1 -1
  204. package/dist/server/preview/controllers/validation/preview.js.map +1 -1
  205. package/dist/server/preview/controllers/validation/preview.mjs +2 -2
  206. package/dist/server/preview/controllers/validation/preview.mjs.map +1 -1
  207. package/dist/server/register.js +4 -0
  208. package/dist/server/register.js.map +1 -1
  209. package/dist/server/register.mjs +4 -0
  210. package/dist/server/register.mjs.map +1 -1
  211. package/dist/server/routes/index.js +3 -1
  212. package/dist/server/routes/index.js.map +1 -1
  213. package/dist/server/routes/index.mjs +2 -0
  214. package/dist/server/routes/index.mjs.map +1 -1
  215. package/dist/server/services/content-types.js +2 -2
  216. package/dist/server/services/content-types.js.map +1 -1
  217. package/dist/server/services/content-types.mjs +2 -2
  218. package/dist/server/services/content-types.mjs.map +1 -1
  219. package/dist/server/services/document-manager.js +13 -0
  220. package/dist/server/services/document-manager.js.map +1 -1
  221. package/dist/server/services/document-manager.mjs +14 -1
  222. package/dist/server/services/document-manager.mjs.map +1 -1
  223. package/dist/server/services/document-metadata.js +1 -1
  224. package/dist/server/services/document-metadata.js.map +1 -1
  225. package/dist/server/services/document-metadata.mjs +1 -1
  226. package/dist/server/services/document-metadata.mjs.map +1 -1
  227. package/dist/server/services/index.js +3 -1
  228. package/dist/server/services/index.js.map +1 -1
  229. package/dist/server/services/index.mjs +2 -0
  230. package/dist/server/services/index.mjs.map +1 -1
  231. package/dist/server/services/utils/configuration/settings.js +2 -1
  232. package/dist/server/services/utils/configuration/settings.js.map +1 -1
  233. package/dist/server/services/utils/configuration/settings.mjs +2 -1
  234. package/dist/server/services/utils/configuration/settings.mjs.map +1 -1
  235. package/dist/server/src/audit-logs.d.ts +40 -0
  236. package/dist/server/src/audit-logs.d.ts.map +1 -0
  237. package/dist/server/src/bootstrap.d.ts.map +1 -1
  238. package/dist/server/src/controllers/collection-types.d.ts +1 -1
  239. package/dist/server/src/controllers/collection-types.d.ts.map +1 -1
  240. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  241. package/dist/server/src/controllers/index.d.ts +21 -3
  242. package/dist/server/src/controllers/index.d.ts.map +1 -1
  243. package/dist/server/src/controllers/relations.d.ts +19 -1
  244. package/dist/server/src/controllers/relations.d.ts.map +1 -1
  245. package/dist/server/src/controllers/single-types.d.ts +1 -1
  246. package/dist/server/src/controllers/single-types.d.ts.map +1 -1
  247. package/dist/server/src/custom-order/constants.d.ts +18 -0
  248. package/dist/server/src/custom-order/constants.d.ts.map +1 -0
  249. package/dist/server/src/custom-order/controllers/custom-order.d.ts +8 -0
  250. package/dist/server/src/custom-order/controllers/custom-order.d.ts.map +1 -0
  251. package/dist/server/src/custom-order/controllers/index.d.ts +3 -0
  252. package/dist/server/src/custom-order/controllers/index.d.ts.map +1 -0
  253. package/dist/server/src/custom-order/index.d.ts +8 -0
  254. package/dist/server/src/custom-order/index.d.ts.map +1 -0
  255. package/dist/server/src/custom-order/routes/custom-order.d.ts +4 -0
  256. package/dist/server/src/custom-order/routes/custom-order.d.ts.map +1 -0
  257. package/dist/server/src/custom-order/routes/index.d.ts +10 -0
  258. package/dist/server/src/custom-order/routes/index.d.ts.map +1 -0
  259. package/dist/server/src/custom-order/services/custom-order.d.ts +43 -0
  260. package/dist/server/src/custom-order/services/custom-order.d.ts.map +1 -0
  261. package/dist/server/src/custom-order/services/document-middleware.d.ts +16 -0
  262. package/dist/server/src/custom-order/services/document-middleware.d.ts.map +1 -0
  263. package/dist/server/src/custom-order/services/index.d.ts +24 -0
  264. package/dist/server/src/custom-order/services/index.d.ts.map +1 -0
  265. package/dist/server/src/custom-order/services/utils.d.ts +34 -0
  266. package/dist/server/src/custom-order/services/utils.d.ts.map +1 -0
  267. package/dist/server/src/custom-order/utils.d.ts +6 -0
  268. package/dist/server/src/custom-order/utils.d.ts.map +1 -0
  269. package/dist/server/src/history/constants.d.ts.map +1 -1
  270. package/dist/server/src/history/controllers/history-version.d.ts.map +1 -1
  271. package/dist/server/src/history/services/history.d.ts.map +1 -1
  272. package/dist/server/src/history/services/lifecycles.d.ts.map +1 -1
  273. package/dist/server/src/index.d.ts +22 -6
  274. package/dist/server/src/index.d.ts.map +1 -1
  275. package/dist/server/src/mcp/schemas/filters-schema.d.ts.map +1 -1
  276. package/dist/server/src/register.d.ts.map +1 -1
  277. package/dist/server/src/routes/index.d.ts.map +1 -1
  278. package/dist/server/src/services/content-types.d.ts +1 -3
  279. package/dist/server/src/services/content-types.d.ts.map +1 -1
  280. package/dist/server/src/services/document-manager.d.ts.map +1 -1
  281. package/dist/server/src/services/index.d.ts +1 -3
  282. package/dist/server/src/services/index.d.ts.map +1 -1
  283. package/dist/server/src/services/utils/configuration/settings.d.ts.map +1 -1
  284. package/dist/shared/contracts/content-types.d.ts +5 -0
  285. package/dist/shared/contracts/content-types.d.ts.map +1 -1
  286. package/dist/shared/contracts/custom-order.d.ts +33 -0
  287. package/dist/shared/contracts/custom-order.d.ts.map +1 -0
  288. package/dist/shared/contracts/custom-order.js +3 -0
  289. package/dist/shared/contracts/custom-order.js.map +1 -0
  290. package/dist/shared/contracts/custom-order.mjs +2 -0
  291. package/dist/shared/contracts/custom-order.mjs.map +1 -0
  292. package/dist/shared/contracts/history-versions.d.ts +0 -1
  293. package/dist/shared/contracts/history-versions.d.ts.map +1 -1
  294. package/dist/shared/contracts/index.d.ts +1 -0
  295. package/dist/shared/contracts/index.d.ts.map +1 -1
  296. package/dist/shared/contracts/index.js +2 -0
  297. package/dist/shared/contracts/index.js.map +1 -1
  298. package/dist/shared/contracts/index.mjs +2 -0
  299. package/dist/shared/contracts/index.mjs.map +1 -1
  300. package/package.json +10 -10
@@ -3,6 +3,8 @@ import * as React from 'react';
3
3
  import { useForm, InputRenderer } from '@strapi/admin/strapi-admin';
4
4
  import { useCollator, Flex, Typography, Grid } from '@strapi/design-system';
5
5
  import { useIntl } from 'react-intl';
6
+ import { COLLECTION_TYPES } from '../../../constants/collections.mjs';
7
+ import { isCustomOrderFeatureEnabled } from '../../../constants/customOrder.mjs';
6
8
  import { useDoc } from '../../../hooks/useDocument.mjs';
7
9
  import { getTranslation } from '../../../utils/translations.mjs';
8
10
 
@@ -20,8 +22,10 @@ const Settings = ()=>{
20
22
  const formatter = useCollator(locale, {
21
23
  sensitivity: 'base'
22
24
  });
23
- const { schema } = useDoc();
25
+ const { schema, collectionType } = useDoc();
24
26
  const layout = useForm('Settings', (state)=>state.values.layout ?? []);
27
+ const hasCustomOrder = useForm('Settings', (state)=>state.values.settings.customOrder);
28
+ const canUseCustomOrder = collectionType === COLLECTION_TYPES && isCustomOrderFeatureEnabled();
25
29
  const currentSortBy = useForm('Settings', (state)=>state.values.settings.defaultSortBy);
26
30
  const onChange = useForm('Settings', (state)=>state.onChange);
27
31
  const sortOptions = React.useMemo(()=>Object.values(layout).reduce((acc, field)=>{
@@ -47,10 +51,17 @@ const Settings = ()=>{
47
51
  onChange,
48
52
  sortOptionsSorted
49
53
  ]);
50
- const formLayout = React.useMemo(()=>SETTINGS_FORM_LAYOUT.map((row)=>row.map((field)=>{
54
+ const formLayout = React.useMemo(()=>[
55
+ ...SETTINGS_FORM_LAYOUT,
56
+ ...canUseCustomOrder ? [
57
+ CUSTOM_ORDER_FORM_LAYOUT
58
+ ] : []
59
+ ].map((row)=>row.map((field)=>{
51
60
  if (field.type === 'enumeration') {
52
61
  return {
53
62
  ...field,
63
+ // The custom order takes over the default sort of the list
64
+ disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),
54
65
  hint: field.hint ? formatMessage(field.hint) : undefined,
55
66
  label: formatMessage(field.label),
56
67
  options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options
@@ -63,7 +74,9 @@ const Settings = ()=>{
63
74
  };
64
75
  }
65
76
  })), [
77
+ canUseCustomOrder,
66
78
  formatMessage,
79
+ hasCustomOrder,
67
80
  sortOptionsSorted
68
81
  ]);
69
82
  return /*#__PURE__*/ jsxs(Flex, {
@@ -175,6 +188,22 @@ const SETTINGS_FORM_LAYOUT = [
175
188
  }
176
189
  ]
177
190
  ];
191
+ const CUSTOM_ORDER_FORM_LAYOUT = [
192
+ {
193
+ hint: {
194
+ id: getTranslation('form.Input.customOrder.hint'),
195
+ defaultMessage: 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.'
196
+ },
197
+ label: {
198
+ id: getTranslation('form.Input.customOrder'),
199
+ defaultMessage: 'Enable custom order'
200
+ },
201
+ name: 'settings.customOrder',
202
+ size: 6,
203
+ type: 'boolean'
204
+ }
205
+ ];
206
+ const isDefaultSortField = (name)=>name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';
178
207
 
179
208
  export { Settings };
180
209
  //# sourceMappingURL=Settings.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"Settings.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n SETTINGS_FORM_LAYOUT.map((row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options: field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as [top: EditFieldLayout[], bottom: EditFieldLayout[]],\n [formatMessage, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","useDoc","layout","useForm","state","values","currentSortBy","settings","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","map","row","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":"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"}
1
+ {"version":3,"file":"Settings.mjs","sources":["../../../../../admin/src/pages/ListConfiguration/components/Settings.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useForm, InputRenderer, type InputProps } from '@strapi/admin/strapi-admin';\nimport { Flex, Grid, Typography, useCollator } from '@strapi/design-system';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport { COLLECTION_TYPES } from '../../../constants/collections';\nimport { isCustomOrderFeatureEnabled } from '../../../constants/customOrder';\nimport { useDoc } from '../../../hooks/useDocument';\nimport { type EditFieldLayout } from '../../../hooks/useDocumentLayout';\nimport { getTranslation } from '../../../utils/translations';\nimport { type FormData } from '../ListConfigurationPage';\n\nimport type { DistributiveOmit } from 'react-redux';\n\nexport type InputPropsWithMessageDescriptors = DistributiveOmit<\n InputProps,\n 'hint' | 'label' | 'placeholder'\n> & {\n hint?: MessageDescriptor;\n label: MessageDescriptor;\n placeholder?: MessageDescriptor;\n};\n\n/**\n * @internal\n * @description Form inputs are always displayed in a grid, so we need\n * to use the size property to determine how many columns the input should\n * take up.\n */\nexport type FormLayoutInputProps = InputPropsWithMessageDescriptors & { size: number };\n\nconst EXCLUDED_SORT_ATTRIBUTE_TYPES = new Set([\n 'media',\n 'richtext',\n 'dynamiczone',\n 'relation',\n 'component',\n 'json',\n 'blocks',\n]);\n\ninterface SortOption {\n value: string;\n label: string;\n}\n\nconst Settings = () => {\n const { formatMessage, locale } = useIntl();\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n const { schema, collectionType } = useDoc();\n\n const layout = useForm<FormData['layout']>(\n 'Settings',\n (state) => (state.values as FormData).layout ?? []\n );\n const hasCustomOrder = useForm<FormData['settings']['customOrder']>(\n 'Settings',\n (state) => (state.values as FormData).settings.customOrder\n );\n const canUseCustomOrder = collectionType === COLLECTION_TYPES && isCustomOrderFeatureEnabled();\n const currentSortBy = useForm<FormData['settings']['defaultSortBy']>(\n 'Settings',\n (state) => (state.values as FormData).settings.defaultSortBy\n );\n const onChange = useForm('Settings', (state) => state.onChange);\n\n const sortOptions = React.useMemo(\n () =>\n Object.values(layout).reduce<SortOption[]>((acc, field) => {\n if (schema && !EXCLUDED_SORT_ATTRIBUTE_TYPES.has(schema.attributes[field.name].type)) {\n acc.push({\n value: field.name,\n label: typeof field.label !== 'string' ? formatMessage(field.label) : field.label,\n });\n }\n\n return acc;\n }, []),\n [formatMessage, layout, schema]\n );\n\n const sortOptionsSorted = sortOptions.sort((a, b) => formatter.compare(a.label, b.label));\n\n React.useEffect(() => {\n if (sortOptionsSorted.findIndex((opt) => opt.value === currentSortBy) === -1) {\n onChange('settings.defaultSortBy', sortOptionsSorted[0]?.value);\n }\n }, [currentSortBy, onChange, sortOptionsSorted]);\n\n const formLayout = React.useMemo(\n () =>\n [...SETTINGS_FORM_LAYOUT, ...(canUseCustomOrder ? [CUSTOM_ORDER_FORM_LAYOUT] : [])].map(\n (row) =>\n row.map((field) => {\n if (field.type === 'enumeration') {\n return {\n ...field,\n // The custom order takes over the default sort of the list\n disabled: canUseCustomOrder && hasCustomOrder && isDefaultSortField(field.name),\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n options:\n field.name === 'settings.defaultSortBy' ? sortOptionsSorted : field.options,\n };\n } else {\n return {\n ...field,\n hint: field.hint ? formatMessage(field.hint) : undefined,\n label: formatMessage(field.label),\n };\n }\n })\n ) as EditFieldLayout[][],\n [canUseCustomOrder, formatMessage, hasCustomOrder, sortOptionsSorted]\n );\n\n return (\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTranslation('containers.SettingPage.settings'),\n defaultMessage: 'Settings',\n })}\n </Typography>\n <Grid.Root key=\"bottom\" gap={4}>\n {formLayout.map((row) =>\n row.map(({ size, ...field }) => (\n <Grid.Item key={field.name} xs={12} col={size} direction=\"column\" alignItems=\"stretch\">\n {/* @ts-expect-error – issue with EnumerationProps conflicting with InputProps */}\n <InputRenderer {...field} />\n </Grid.Item>\n ))\n )}\n </Grid.Root>\n </Flex>\n );\n};\n\nconst SETTINGS_FORM_LAYOUT: FormLayoutInputProps[][] = [\n [\n {\n label: {\n id: getTranslation('form.Input.search'),\n defaultMessage: 'Enable search',\n },\n name: 'settings.searchable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.filters'),\n defaultMessage: 'Enable filters',\n },\n name: 'settings.filterable',\n size: 4,\n type: 'boolean' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.bulkActions'),\n defaultMessage: 'Enable bulk actions',\n },\n name: 'settings.bulkable',\n size: 4,\n type: 'boolean' as const,\n },\n ],\n [\n {\n hint: {\n id: getTranslation('form.Input.pageEntries.inputDescription'),\n defaultMessage: 'Note: You can override this value in the Collection Type settings page.',\n },\n label: {\n id: getTranslation('form.Input.pageEntries'),\n defaultMessage: 'Entries per page',\n },\n name: 'settings.pageSize',\n options: ['10', '20', '50', '100'].map((value) => ({ value, label: value })),\n size: 6,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.defaultSort'),\n defaultMessage: 'Default sort attribute',\n },\n name: 'settings.defaultSortBy',\n options: [],\n size: 3,\n type: 'enumeration' as const,\n },\n {\n label: {\n id: getTranslation('form.Input.sort.order'),\n defaultMessage: 'Default sort order',\n },\n name: 'settings.defaultSortOrder',\n options: ['ASC', 'DESC'].map((value) => ({ value, label: value })),\n size: 3,\n type: 'enumeration' as const,\n },\n ],\n];\n\nconst CUSTOM_ORDER_FORM_LAYOUT: FormLayoutInputProps[] = [\n {\n hint: {\n id: getTranslation('form.Input.customOrder.hint'),\n defaultMessage:\n 'Arrange entries by hand in the list view. New entries are added on top. The Content API returns entries in this order when no sort is requested.',\n },\n label: {\n id: getTranslation('form.Input.customOrder'),\n defaultMessage: 'Enable custom order',\n },\n name: 'settings.customOrder',\n size: 6,\n type: 'boolean' as const,\n },\n];\n\nconst isDefaultSortField = (name: string) =>\n name === 'settings.defaultSortBy' || name === 'settings.defaultSortOrder';\n\nexport { Settings };\n"],"names":["EXCLUDED_SORT_ATTRIBUTE_TYPES","Set","Settings","formatMessage","locale","useIntl","formatter","useCollator","sensitivity","schema","collectionType","useDoc","layout","useForm","state","values","hasCustomOrder","settings","customOrder","canUseCustomOrder","COLLECTION_TYPES","isCustomOrderFeatureEnabled","currentSortBy","defaultSortBy","onChange","sortOptions","React","useMemo","Object","reduce","acc","field","has","attributes","name","type","push","value","label","sortOptionsSorted","sort","a","b","compare","useEffect","findIndex","opt","formLayout","SETTINGS_FORM_LAYOUT","CUSTOM_ORDER_FORM_LAYOUT","map","row","disabled","isDefaultSortField","hint","undefined","options","_jsxs","Flex","direction","alignItems","gap","_jsx","Typography","variant","tag","id","getTranslation","defaultMessage","Grid","Root","size","Item","xs","col","InputRenderer"],"mappings":"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"}
@@ -11,6 +11,8 @@ var reactIntl = require('react-intl');
11
11
  var reactRouterDom = require('react-router-dom');
12
12
  var styledComponents = require('styled-components');
13
13
  var InjectionZone = require('../../components/InjectionZone.js');
14
+ var collections = require('../../constants/collections.js');
15
+ var customOrder = require('../../constants/customOrder.js');
14
16
  var hooks = require('../../constants/hooks.js');
15
17
  var plugin = require('../../constants/plugin.js');
16
18
  var DocumentRBAC = require('../../features/DocumentRBAC.js');
@@ -25,6 +27,7 @@ var translations = require('../../utils/translations.js');
25
27
  var users = require('../../utils/users.js');
26
28
  var DocumentStatus = require('../EditView/components/DocumentStatus.js');
27
29
  var Actions = require('./components/BulkActions/Actions.js');
30
+ var CustomOrder = require('./components/CustomOrder.js');
28
31
  var Filters = require('./components/Filters.js');
29
32
  var TableActions = require('./components/TableActions.js');
30
33
  var CellContent = require('./components/TableCells/CellContent.js');
@@ -63,6 +66,16 @@ const NON_LINKABLE_TYPES = new Set([
63
66
  * -----------------------------------------------------------------------------------------------*/ const LayoutsHeaderCustom = styledComponents.styled(strapiAdmin.Layouts.Header)`
64
67
  overflow-wrap: anywhere;
65
68
  `;
69
+ /**
70
+ * When the entries of the collection type follow a custom order, that order is
71
+ * what the list shows unless the user sorts on a column.
72
+ */ const hasCustomOrderEnabled = (collectionType, settings)=>collectionType === collections.COLLECTION_TYPES && settings.customOrder === true && customOrder.isCustomOrderFeatureEnabled();
73
+ const getDefaultSort = (settings, hasCustomOrder)=>{
74
+ if (hasCustomOrder) {
75
+ return customOrder.CUSTOM_ORDER_SORT;
76
+ }
77
+ return settings.defaultSortBy ? `${settings.defaultSortBy}:${settings.defaultSortOrder}` : '';
78
+ };
66
79
  const ListViewPage = ()=>{
67
80
  const { trackUsage } = strapiAdmin.useTracking();
68
81
  const navigate = reactRouterDom.useNavigate();
@@ -178,11 +191,26 @@ const ListViewPage = ()=>{
178
191
  schema?.attributes,
179
192
  schema?.uid
180
193
  ]);
194
+ const hasCustomOrder = hasCustomOrderEnabled(collectionType, list.settings);
181
195
  const [{ query }, setQuery] = strapiAdmin.useQueryParams({
182
196
  page: '1',
183
197
  pageSize: list.settings.pageSize.toString(),
184
- sort: list.settings.defaultSortBy ? `${list.settings.defaultSortBy}:${list.settings.defaultSortOrder}` : ''
198
+ sort: getDefaultSort(list.settings, hasCustomOrder)
185
199
  });
200
+ // A sort on the custom order can be left over in the URL or in the saved view
201
+ // after the setting has been turned off.
202
+ React__namespace.useEffect(()=>{
203
+ if (!isLoadingLayout && !hasCustomOrder && typeof query.sort === 'string' && query.sort.startsWith(`${customOrder.CUSTOM_ORDER_FIELD}:`)) {
204
+ setQuery(strapiAdmin.withEncodedUserParams(query, {
205
+ sort: undefined
206
+ }), 'push', true);
207
+ }
208
+ }, [
209
+ hasCustomOrder,
210
+ isLoadingLayout,
211
+ query,
212
+ setQuery
213
+ ]);
186
214
  React__namespace.useEffect(()=>{
187
215
  if (!configurationReady || !schema?.attributes || schema.uid !== model) {
188
216
  return;
@@ -247,7 +275,7 @@ const ListViewPage = ()=>{
247
275
  query,
248
276
  setQuery
249
277
  ]);
250
- const { data, error, isLoading, isFetching } = documents.useGetAllDocumentsQuery({
278
+ const { data, error, isLoading, isFetching, fulfilledTimeStamp } = documents.useGetAllDocumentsQuery({
251
279
  model,
252
280
  params
253
281
  }, {
@@ -285,10 +313,19 @@ const ListViewPage = ()=>{
285
313
  query,
286
314
  navigate
287
315
  ]);
288
- const { canCreate, isLoadingActionsRBAC } = DocumentRBAC.useDocumentRBAC('ListViewPage', ({ canCreate, isLoading })=>({
316
+ const { canCreate, canUpdate, isLoadingActionsRBAC } = DocumentRBAC.useDocumentRBAC('ListViewPage', ({ canCreate, canUpdate, isLoading })=>({
289
317
  canCreate,
318
+ canUpdate,
290
319
  isLoadingActionsRBAC: isLoading
291
320
  }));
321
+ const customOrder$1 = CustomOrder.useCustomOrder({
322
+ model,
323
+ isAvailable: hasCustomOrder,
324
+ canUpdate: canUpdate === true,
325
+ sort: query.sort,
326
+ params,
327
+ results,
328
+ pagination});
292
329
  const runHookWaterfall = strapiAdmin.useStrapiApp('ListViewPage', ({ runHookWaterfall })=>runHookWaterfall);
293
330
  /**
294
331
  * Run the waterfall and then inject our additional table headers.
@@ -327,10 +364,26 @@ const ListViewPage = ()=>{
327
364
  sortable: !hasStatusFilter
328
365
  });
329
366
  }
367
+ if (hasCustomOrder) {
368
+ // Sorting on this column is how the user comes back to the custom order
369
+ formattedHeaders.unshift({
370
+ attribute: {
371
+ type: 'custom'
372
+ },
373
+ name: customOrder.CUSTOM_ORDER_FIELD,
374
+ label: formatMessage({
375
+ id: translations.getTranslation('containers.list.table-headers.order'),
376
+ defaultMessage: 'order'
377
+ }),
378
+ searchable: false,
379
+ sortable: true
380
+ });
381
+ }
330
382
  return formattedHeaders;
331
383
  }, [
332
384
  displayedHeaders,
333
385
  formatMessage,
386
+ hasCustomOrder,
334
387
  hasStatusFilter,
335
388
  list,
336
389
  runHookWaterfall,
@@ -368,7 +421,7 @@ const ListViewPage = ()=>{
368
421
  * Only genuinely interactive cells are skipped: relations, media, components,
369
422
  * dynamic zones (they embed their own links/menus), plugin-formatted columns
370
423
  * (`cellFormatter`), and the synthetic `status` column.
371
- */ const linkCandidates = tableHeaders.filter(({ name, attribute, cellFormatter })=>name !== 'status' && typeof cellFormatter !== 'function' && attribute && !NON_LINKABLE_TYPES.has(attribute.type));
424
+ */ const linkCandidates = tableHeaders.filter(({ name, attribute, cellFormatter })=>name !== 'status' && name !== customOrder.CUSTOM_ORDER_FIELD && typeof cellFormatter !== 'function' && attribute && !NON_LINKABLE_TYPES.has(attribute.type));
372
425
  // The link column for a given row: the first candidate that actually has a
373
426
  // value (uses CellContent's own hasContent so it matches the "-" the cell
374
427
  // would otherwise render). documentId is checked directly (its own cell).
@@ -483,141 +536,152 @@ const ListViewPage = ()=>{
483
536
  direction: "column",
484
537
  alignItems: "stretch",
485
538
  children: [
486
- /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Root, {
487
- rows: results,
488
- headers: tableHeaders,
489
- isLoading: isFetching,
490
- children: [
491
- /*#__PURE__*/ jsxRuntime.jsx(TableActionsBar, {}),
492
- /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Content, {
493
- children: [
494
- /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Head, {
495
- children: [
496
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.HeaderCheckboxCell, {}),
497
- tableHeaders.map((header)=>/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.HeaderCell, {
498
- ...header
499
- }, header.name))
500
- ]
501
- }),
502
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Loading, {}),
503
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Empty, {
504
- action: canCreate ? /*#__PURE__*/ jsxRuntime.jsx(CreateButton, {
505
- variant: "secondary"
506
- }) : null
507
- }),
508
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Body, {
509
- children: results.map((row)=>{
510
- const rowLinkField = getRowLinkField(row);
511
- return /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Row, {
512
- cursor: "pointer",
513
- onClick: handleRowClick(row.documentId),
514
- children: [
515
- /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.CheckboxCell, {
516
- id: row.id
517
- }),
518
- tableHeaders.map(({ cellFormatter, ...header })=>{
519
- if (header.name === 'status') {
520
- const { status } = row;
521
- return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
522
- children: /*#__PURE__*/ jsxRuntime.jsx(DocumentStatus.DocumentStatus, {
523
- status: status,
524
- maxWidth: 'min-content'
525
- })
526
- }, header.name);
527
- }
528
- if ([
529
- 'createdBy',
530
- 'updatedBy'
531
- ].includes(header.name.split('.')[0])) {
532
- // Display the users full name
533
- // Some entries doesn't have a user assigned as creator/updater (ex: entries created through content API)
534
- // In this case, we display a dash
535
- return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
536
- children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
537
- textColor: "neutral800",
538
- children: row[header.name.split('.')[0]] ? users.getDisplayName(row[header.name.split('.')[0]]) : '-'
539
- })
540
- }, header.name);
541
- }
542
- if (header.name === 'documentId') {
543
- // When documentId is the primary link column, only its
544
- // id text becomes the link; the copy button stays outside.
545
- const isDocumentIdLink = header.name === rowLinkField && Boolean(row.documentId);
546
- return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
547
- children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
548
- gap: 2,
549
- alignItems: "center",
550
- width: "100%",
551
- minWidth: 0,
552
- children: [
553
- isDocumentIdLink ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
554
- tag: reactRouterDom.Link,
555
- to: {
556
- pathname: row.documentId,
557
- search: qs.stringify({
558
- plugins: query.plugins
559
- })
560
- },
561
- onClick: (e)=>e.stopPropagation(),
562
- textColor: "neutral800",
563
- maxWidth: "30rem",
564
- ellipsis: true,
565
- children: row.documentId
566
- }) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
567
- textColor: "neutral800",
568
- maxWidth: "30rem",
569
- ellipsis: true,
570
- children: row.documentId || '-'
571
- }),
572
- row.documentId && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
573
- variant: "ghost",
574
- size: "S",
575
- label: formatMessage({
576
- id: 'content-manager.actions.copy-documentId.label',
577
- defaultMessage: 'Copy'
539
+ /*#__PURE__*/ jsxRuntime.jsx(CustomOrder.CustomOrder.Root, {
540
+ state: customOrder$1,
541
+ children: /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Root, {
542
+ rows: customOrder$1.rows,
543
+ headers: tableHeaders,
544
+ isLoading: isFetching && !customOrder$1.isMoving,
545
+ children: [
546
+ /*#__PURE__*/ jsxRuntime.jsx(TableActionsBar, {}),
547
+ /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Content, {
548
+ children: [
549
+ /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Table.Head, {
550
+ children: [
551
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.HeaderCheckboxCell, {}),
552
+ tableHeaders.map((header)=>/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.HeaderCell, {
553
+ ...header
554
+ }, header.name))
555
+ ]
556
+ }),
557
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Loading, {}),
558
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Empty, {
559
+ action: canCreate ? /*#__PURE__*/ jsxRuntime.jsx(CreateButton, {
560
+ variant: "secondary"
561
+ }) : null
562
+ }),
563
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Body, {
564
+ children: customOrder$1.rows.map((row, index)=>{
565
+ const rowLinkField = getRowLinkField(row);
566
+ return /*#__PURE__*/ jsxRuntime.jsxs(CustomOrder.CustomOrder.Row, {
567
+ cursor: "pointer",
568
+ documentId: row.documentId,
569
+ onClick: handleRowClick(row.documentId),
570
+ children: [
571
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.CheckboxCell, {
572
+ id: row.id
573
+ }),
574
+ tableHeaders.map(({ cellFormatter, ...header })=>{
575
+ if (header.name === customOrder.CUSTOM_ORDER_FIELD) {
576
+ return /*#__PURE__*/ jsxRuntime.jsx(CustomOrder.CustomOrder.PositionCell, {
577
+ documentId: row.documentId,
578
+ position: ((pagination?.page ?? 1) - 1) * (pagination?.pageSize ?? 0) + index + 1,
579
+ total: pagination?.total ?? customOrder$1.rows.length
580
+ }, header.name);
581
+ }
582
+ if (header.name === 'status') {
583
+ const { status } = row;
584
+ return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
585
+ children: /*#__PURE__*/ jsxRuntime.jsx(DocumentStatus.DocumentStatus, {
586
+ status: status,
587
+ maxWidth: 'min-content'
588
+ })
589
+ }, header.name);
590
+ }
591
+ if ([
592
+ 'createdBy',
593
+ 'updatedBy'
594
+ ].includes(header.name.split('.')[0])) {
595
+ // Display the users full name
596
+ // Some entries doesn't have a user assigned as creator/updater (ex: entries created through content API)
597
+ // In this case, we display a dash
598
+ return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
599
+ children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
600
+ textColor: "neutral800",
601
+ children: row[header.name.split('.')[0]] ? users.getDisplayName(row[header.name.split('.')[0]]) : '-'
602
+ })
603
+ }, header.name);
604
+ }
605
+ if (header.name === 'documentId') {
606
+ // When documentId is the primary link column, only its
607
+ // id text becomes the link; the copy button stays outside.
608
+ const isDocumentIdLink = header.name === rowLinkField && Boolean(row.documentId);
609
+ return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
610
+ children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
611
+ gap: 2,
612
+ alignItems: "center",
613
+ width: "100%",
614
+ minWidth: 0,
615
+ children: [
616
+ isDocumentIdLink ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
617
+ tag: reactRouterDom.Link,
618
+ to: {
619
+ pathname: row.documentId,
620
+ search: qs.stringify({
621
+ plugins: query.plugins
622
+ })
623
+ },
624
+ onClick: (e)=>e.stopPropagation(),
625
+ textColor: "neutral800",
626
+ maxWidth: "30rem",
627
+ ellipsis: true,
628
+ children: row.documentId
629
+ }) : /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
630
+ textColor: "neutral800",
631
+ maxWidth: "30rem",
632
+ ellipsis: true,
633
+ children: row.documentId || '-'
578
634
  }),
579
- onClick: (e)=>handleCopyDocumentId(e, row.documentId),
580
- children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Duplicate, {})
581
- })
582
- ]
583
- })
584
- }, header.name);
585
- }
586
- if (typeof cellFormatter === 'function') {
635
+ row.documentId && /*#__PURE__*/ jsxRuntime.jsx(designSystem.IconButton, {
636
+ variant: "ghost",
637
+ size: "S",
638
+ label: formatMessage({
639
+ id: 'content-manager.actions.copy-documentId.label',
640
+ defaultMessage: 'Copy'
641
+ }),
642
+ onClick: (e)=>handleCopyDocumentId(e, row.documentId),
643
+ children: /*#__PURE__*/ jsxRuntime.jsx(Icons.Duplicate, {})
644
+ })
645
+ ]
646
+ })
647
+ }, header.name);
648
+ }
649
+ if (typeof cellFormatter === 'function') {
650
+ return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
651
+ children: cellFormatter(row, header, {
652
+ collectionType,
653
+ model
654
+ })
655
+ }, header.name);
656
+ }
587
657
  return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
588
- children: cellFormatter(row, header, {
589
- collectionType,
590
- model
658
+ children: /*#__PURE__*/ jsxRuntime.jsx(CellContent.CellContent, {
659
+ content: row[header.name.split('.')[0]],
660
+ rowId: row.documentId,
661
+ ...header,
662
+ linkTo: header.name === rowLinkField ? {
663
+ pathname: row.documentId,
664
+ search: qs.stringify({
665
+ plugins: query.plugins
666
+ })
667
+ } : undefined
591
668
  })
592
669
  }, header.name);
593
- }
594
- return /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Table.Cell, {
595
- children: /*#__PURE__*/ jsxRuntime.jsx(CellContent.CellContent, {
596
- content: row[header.name.split('.')[0]],
597
- rowId: row.documentId,
598
- ...header,
599
- linkTo: header.name === rowLinkField ? {
600
- pathname: row.documentId,
601
- search: qs.stringify({
602
- plugins: query.plugins
603
- })
604
- } : undefined
670
+ }),
671
+ /*#__PURE__*/ jsxRuntime.jsx(ActionsCell, {
672
+ onClick: (e)=>e.stopPropagation(),
673
+ children: /*#__PURE__*/ jsxRuntime.jsx(TableActions.TableActions, {
674
+ document: row
605
675
  })
606
- }, header.name);
607
- }),
608
- /*#__PURE__*/ jsxRuntime.jsx(ActionsCell, {
609
- onClick: (e)=>e.stopPropagation(),
610
- children: /*#__PURE__*/ jsxRuntime.jsx(TableActions.TableActions, {
611
- document: row
612
676
  })
613
- })
614
- ]
615
- }, row.id);
677
+ ]
678
+ }, row.id);
679
+ })
616
680
  })
617
- })
618
- ]
619
- })
620
- ]
681
+ ]
682
+ })
683
+ ]
684
+ })
621
685
  }),
622
686
  /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Pagination.Root, {
623
687
  ...pagination,