@strapi/upload 5.59.0 → 5.60.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 (231) hide show
  1. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js +434 -0
  2. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.js.map +1 -0
  3. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs +432 -0
  4. package/dist/admin/components/AssetPickerDialog/AssetPickerDialog.mjs.map +1 -0
  5. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js +91 -0
  6. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.js.map +1 -0
  7. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs +89 -0
  8. package/dist/admin/components/AssetPickerDialog/FolderBreadcrumbs.mjs.map +1 -0
  9. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js +178 -0
  10. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.js.map +1 -0
  11. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs +175 -0
  12. package/dist/admin/components/AssetPickerDialog/PickerSelectionProvider.mjs.map +1 -0
  13. package/dist/admin/components/AssetPickerDialog/SortableSelection.js +143 -0
  14. package/dist/admin/components/AssetPickerDialog/SortableSelection.js.map +1 -0
  15. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs +141 -0
  16. package/dist/admin/components/AssetPickerDialog/SortableSelection.mjs.map +1 -0
  17. package/dist/admin/components/AssetPickerDialog/pickerSelection.js +49 -0
  18. package/dist/admin/components/AssetPickerDialog/pickerSelection.js.map +1 -0
  19. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs +41 -0
  20. package/dist/admin/components/AssetPickerDialog/pickerSelection.mjs.map +1 -0
  21. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js +4 -3
  22. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.js.map +1 -1
  23. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs +4 -3
  24. package/dist/admin/components/MediaLibraryInput/AddAssetMenu.mjs.map +1 -1
  25. package/dist/admin/components/MediaLibraryInput/AssetCard.js +240 -0
  26. package/dist/admin/components/MediaLibraryInput/AssetCard.js.map +1 -0
  27. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs +237 -0
  28. package/dist/admin/components/MediaLibraryInput/AssetCard.mjs.map +1 -0
  29. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js +161 -0
  30. package/dist/admin/components/MediaLibraryInput/AssetCarousel.js.map +1 -0
  31. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs +159 -0
  32. package/dist/admin/components/MediaLibraryInput/AssetCarousel.mjs.map +1 -0
  33. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js +76 -49
  34. package/dist/admin/components/MediaLibraryInput/AssetDropZone.js.map +1 -1
  35. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs +77 -50
  36. package/dist/admin/components/MediaLibraryInput/AssetDropZone.mjs.map +1 -1
  37. package/dist/admin/components/MediaLibraryInput/AssetPreview.js +109 -0
  38. package/dist/admin/components/MediaLibraryInput/AssetPreview.js.map +1 -0
  39. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs +106 -0
  40. package/dist/admin/components/MediaLibraryInput/AssetPreview.mjs.map +1 -0
  41. package/dist/admin/components/MediaLibraryInput/AssetRow.js +146 -79
  42. package/dist/admin/components/MediaLibraryInput/AssetRow.js.map +1 -1
  43. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs +148 -82
  44. package/dist/admin/components/MediaLibraryInput/AssetRow.mjs.map +1 -1
  45. package/dist/admin/components/MediaLibraryInput/FieldControls.js +32 -0
  46. package/dist/admin/components/MediaLibraryInput/FieldControls.js.map +1 -0
  47. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs +29 -0
  48. package/dist/admin/components/MediaLibraryInput/FieldControls.mjs.map +1 -0
  49. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +130 -88
  50. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  51. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs +129 -91
  52. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.mjs.map +1 -1
  53. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js +42 -0
  54. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.js.map +1 -0
  55. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs +40 -0
  56. package/dist/admin/components/MediaLibraryInput/UploadProgressBar.mjs.map +1 -0
  57. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js +122 -0
  58. package/dist/admin/components/MediaLibraryInput/useFieldUploads.js.map +1 -0
  59. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs +120 -0
  60. package/dist/admin/components/MediaLibraryInput/useFieldUploads.mjs.map +1 -0
  61. package/dist/admin/components/UploadProgressDialog.js +2 -1
  62. package/dist/admin/components/UploadProgressDialog.js.map +1 -1
  63. package/dist/admin/components/UploadProgressDialog.mjs +2 -1
  64. package/dist/admin/components/UploadProgressDialog.mjs.map +1 -1
  65. package/dist/admin/hooks/useMediaLibraryPermissions.js +12 -2
  66. package/dist/admin/hooks/useMediaLibraryPermissions.js.map +1 -1
  67. package/dist/admin/hooks/useMediaLibraryPermissions.mjs +12 -2
  68. package/dist/admin/hooks/useMediaLibraryPermissions.mjs.map +1 -1
  69. package/dist/admin/pages/Assets/AssetsPage.js +13 -302
  70. package/dist/admin/pages/Assets/AssetsPage.js.map +1 -1
  71. package/dist/admin/pages/Assets/AssetsPage.mjs +11 -280
  72. package/dist/admin/pages/Assets/AssetsPage.mjs.map +1 -1
  73. package/dist/admin/pages/Assets/components/AssetsGrid.js +142 -31
  74. package/dist/admin/pages/Assets/components/AssetsGrid.js.map +1 -1
  75. package/dist/admin/pages/Assets/components/AssetsGrid.mjs +145 -34
  76. package/dist/admin/pages/Assets/components/AssetsGrid.mjs.map +1 -1
  77. package/dist/admin/pages/Assets/components/AssetsSearchInput.js +43 -2
  78. package/dist/admin/pages/Assets/components/AssetsSearchInput.js.map +1 -1
  79. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs +45 -4
  80. package/dist/admin/pages/Assets/components/AssetsSearchInput.mjs.map +1 -1
  81. package/dist/admin/pages/Assets/components/AssetsTable.js +58 -34
  82. package/dist/admin/pages/Assets/components/AssetsTable.js.map +1 -1
  83. package/dist/admin/pages/Assets/components/AssetsTable.mjs +60 -36
  84. package/dist/admin/pages/Assets/components/AssetsTable.mjs.map +1 -1
  85. package/dist/admin/pages/Assets/components/AssetsView.js +145 -0
  86. package/dist/admin/pages/Assets/components/AssetsView.js.map +1 -0
  87. package/dist/admin/pages/Assets/components/AssetsView.mjs +143 -0
  88. package/dist/admin/pages/Assets/components/AssetsView.mjs.map +1 -0
  89. package/dist/admin/pages/Assets/components/BulkActionsBar.mjs +1 -1
  90. package/dist/admin/pages/Assets/components/BusyOverlay.mjs +1 -1
  91. package/dist/admin/pages/Assets/components/Dnd/DragOverlayChip.mjs +1 -1
  92. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js +40 -0
  93. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.js.map +1 -0
  94. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs +38 -0
  95. package/dist/admin/pages/Assets/components/Dnd/ReorderHandle.mjs.map +1 -0
  96. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js +29 -0
  97. package/dist/admin/pages/Assets/components/Dnd/assetSortable.js.map +1 -0
  98. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs +24 -0
  99. package/dist/admin/pages/Assets/components/Dnd/assetSortable.mjs.map +1 -0
  100. package/dist/admin/pages/Assets/components/Dnd/dndIds.js +5 -0
  101. package/dist/admin/pages/Assets/components/Dnd/dndIds.js.map +1 -1
  102. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs +5 -1
  103. package/dist/admin/pages/Assets/components/Dnd/dndIds.mjs.map +1 -1
  104. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js +41 -13
  105. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.js.map +1 -1
  106. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs +41 -13
  107. package/dist/admin/pages/Assets/components/Dnd/useAssetDnd.mjs.map +1 -1
  108. package/dist/admin/pages/Assets/components/FilterBadges.mjs +2 -2
  109. package/dist/admin/pages/Assets/components/FilterMenu.mjs +2 -2
  110. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js +274 -55
  111. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.js.map +1 -1
  112. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs +277 -59
  113. package/dist/admin/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -1
  114. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js +32 -0
  115. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.js.map +1 -0
  116. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs +29 -0
  117. package/dist/admin/pages/Assets/components/FolderTree/collapsedBranch.mjs.map +1 -0
  118. package/dist/admin/pages/Assets/components/ViewToggle.js +126 -0
  119. package/dist/admin/pages/Assets/components/ViewToggle.js.map +1 -0
  120. package/dist/admin/pages/Assets/components/ViewToggle.mjs +104 -0
  121. package/dist/admin/pages/Assets/components/ViewToggle.mjs.map +1 -0
  122. package/dist/admin/pages/Assets/hooks/useAssetSearch.js +2 -2
  123. package/dist/admin/pages/Assets/hooks/useAssetSearch.js.map +1 -1
  124. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs +2 -2
  125. package/dist/admin/pages/Assets/hooks/useAssetSearch.mjs.map +1 -1
  126. package/dist/admin/pages/Assets/hooks/useAssetSelection.js +19 -1
  127. package/dist/admin/pages/Assets/hooks/useAssetSelection.js.map +1 -1
  128. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs +20 -3
  129. package/dist/admin/pages/Assets/hooks/useAssetSelection.mjs.map +1 -1
  130. package/dist/admin/pages/Assets/hooks/useAssetsList.js +87 -0
  131. package/dist/admin/pages/Assets/hooks/useAssetsList.js.map +1 -0
  132. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs +85 -0
  133. package/dist/admin/pages/Assets/hooks/useAssetsList.mjs.map +1 -0
  134. package/dist/admin/pages/Assets/hooks/useBusyAssets.mjs +1 -1
  135. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js +2 -1
  136. package/dist/admin/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  137. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs +3 -2
  138. package/dist/admin/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  139. package/dist/admin/pages/Assets/hooks/useListFilters.js +2 -1
  140. package/dist/admin/pages/Assets/hooks/useListFilters.js.map +1 -1
  141. package/dist/admin/pages/Assets/hooks/useListFilters.mjs +3 -2
  142. package/dist/admin/pages/Assets/hooks/useListFilters.mjs.map +1 -1
  143. package/dist/admin/pages/Assets/hooks/useListQueryParams.js +80 -0
  144. package/dist/admin/pages/Assets/hooks/useListQueryParams.js.map +1 -0
  145. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs +77 -0
  146. package/dist/admin/pages/Assets/hooks/useListQueryParams.mjs.map +1 -0
  147. package/dist/admin/pages/Assets/hooks/useListSettings.js +32 -0
  148. package/dist/admin/pages/Assets/hooks/useListSettings.js.map +1 -0
  149. package/dist/admin/pages/Assets/hooks/useListSettings.mjs +29 -0
  150. package/dist/admin/pages/Assets/hooks/useListSettings.mjs.map +1 -0
  151. package/dist/admin/pages/Assets/hooks/useListSort.js +2 -1
  152. package/dist/admin/pages/Assets/hooks/useListSort.js.map +1 -1
  153. package/dist/admin/pages/Assets/hooks/useListSort.mjs +3 -2
  154. package/dist/admin/pages/Assets/hooks/useListSort.mjs.map +1 -1
  155. package/dist/admin/services/api.js +92 -7
  156. package/dist/admin/services/api.js.map +1 -1
  157. package/dist/admin/services/api.mjs +91 -9
  158. package/dist/admin/services/api.mjs.map +1 -1
  159. package/dist/admin/src/components/AssetPickerDialog/AssetPickerDialog.d.ts +19 -0
  160. package/dist/admin/src/components/AssetPickerDialog/FolderBreadcrumbs.d.ts +10 -0
  161. package/dist/admin/src/components/AssetPickerDialog/PickerSelectionProvider.d.ts +28 -0
  162. package/dist/admin/src/components/AssetPickerDialog/SortableSelection.d.ts +12 -0
  163. package/dist/admin/src/components/AssetPickerDialog/pickerSelection.d.ts +26 -0
  164. package/dist/admin/src/components/MediaLibraryInput/AssetCard.d.ts +25 -0
  165. package/dist/admin/src/components/MediaLibraryInput/AssetCarousel.d.ts +16 -0
  166. package/dist/admin/src/components/MediaLibraryInput/AssetDropZone.d.ts +11 -3
  167. package/dist/admin/src/components/MediaLibraryInput/AssetPreview.d.ts +17 -0
  168. package/dist/admin/src/components/MediaLibraryInput/AssetRow.d.ts +13 -3
  169. package/dist/admin/src/components/MediaLibraryInput/FieldControls.d.ts +19 -0
  170. package/dist/admin/src/components/MediaLibraryInput/MediaLibraryInput.d.ts +3 -1
  171. package/dist/admin/src/components/MediaLibraryInput/UploadProgressBar.d.ts +7 -0
  172. package/dist/admin/src/components/MediaLibraryInput/useFieldUploads.d.ts +31 -0
  173. package/dist/admin/src/hooks/useMediaLibraryPermissions.d.ts +2 -0
  174. package/dist/admin/src/pages/Assets/components/AssetsGrid.d.ts +3 -1
  175. package/dist/admin/src/pages/Assets/components/AssetsSearchInput.d.ts +11 -1
  176. package/dist/admin/src/pages/Assets/components/AssetsView.d.ts +29 -0
  177. package/dist/admin/src/pages/Assets/components/Dnd/ReorderHandle.d.ts +12 -0
  178. package/dist/admin/src/pages/Assets/components/Dnd/assetSortable.d.ts +37 -0
  179. package/dist/admin/src/pages/Assets/components/Dnd/dndIds.d.ts +5 -0
  180. package/dist/admin/src/pages/Assets/components/Dnd/useAssetDnd.d.ts +23 -2
  181. package/dist/admin/src/pages/Assets/components/FolderTree/FolderTree.d.ts +1 -0
  182. package/dist/admin/src/pages/Assets/components/FolderTree/collapsedBranch.d.ts +21 -0
  183. package/dist/admin/src/pages/Assets/components/ViewToggle.d.ts +8 -0
  184. package/dist/admin/src/pages/Assets/hooks/useAssetSelection.d.ts +26 -0
  185. package/dist/admin/src/pages/Assets/hooks/useAssetsList.d.ts +30 -0
  186. package/dist/admin/src/pages/Assets/hooks/useListQueryParams.d.ts +27 -0
  187. package/dist/admin/src/pages/Assets/hooks/useListSettings.d.ts +29 -0
  188. package/dist/admin/src/services/api.d.ts +24 -1
  189. package/dist/admin/src/store/uploadProgress.d.ts +14 -1
  190. package/dist/admin/src/utils/findFolderPath.d.ts +6 -0
  191. package/dist/admin/src/utils/isAllowedAssetType.d.ts +14 -0
  192. package/dist/admin/store/uploadProgress.js +30 -3
  193. package/dist/admin/store/uploadProgress.js.map +1 -1
  194. package/dist/admin/store/uploadProgress.mjs +29 -4
  195. package/dist/admin/store/uploadProgress.mjs.map +1 -1
  196. package/dist/admin/translations/en.json.js +20 -0
  197. package/dist/admin/translations/en.json.js.map +1 -1
  198. package/dist/admin/translations/en.json.mjs +20 -0
  199. package/dist/admin/translations/en.json.mjs.map +1 -1
  200. package/dist/admin/utils/findFolderPath.js +26 -0
  201. package/dist/admin/utils/findFolderPath.js.map +1 -0
  202. package/dist/admin/utils/findFolderPath.mjs +24 -0
  203. package/dist/admin/utils/findFolderPath.mjs.map +1 -0
  204. package/dist/admin/utils/isAllowedAssetType.js +33 -0
  205. package/dist/admin/utils/isAllowedAssetType.js.map +1 -0
  206. package/dist/admin/utils/isAllowedAssetType.mjs +31 -0
  207. package/dist/admin/utils/isAllowedAssetType.mjs.map +1 -0
  208. package/dist/server/controllers/admin-settings.js +5 -1
  209. package/dist/server/controllers/admin-settings.js.map +1 -1
  210. package/dist/server/controllers/admin-settings.mjs +5 -1
  211. package/dist/server/controllers/admin-settings.mjs.map +1 -1
  212. package/dist/server/services/image-manipulation.js +2 -2
  213. package/dist/server/services/image-manipulation.js.map +1 -1
  214. package/dist/server/services/image-manipulation.mjs +2 -2
  215. package/dist/server/services/image-manipulation.mjs.map +1 -1
  216. package/dist/server/services/upload.js.map +1 -1
  217. package/dist/server/services/upload.mjs.map +1 -1
  218. package/dist/server/src/controllers/admin-settings.d.ts.map +1 -1
  219. package/dist/server/src/index.d.ts +1 -1
  220. package/dist/server/src/services/extensions/utils.d.ts +11 -11
  221. package/dist/server/src/services/image-manipulation.d.ts +1 -1
  222. package/dist/server/src/services/image-manipulation.d.ts.map +1 -1
  223. package/dist/server/src/services/index.d.ts +1 -1
  224. package/dist/server/src/types.d.ts +63 -12
  225. package/dist/server/src/types.d.ts.map +1 -1
  226. package/package.json +8 -6
  227. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js +0 -45
  228. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.js.map +0 -1
  229. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs +0 -43
  230. package/dist/admin/components/MediaLibraryInput/NoLibraryAccessDialog.mjs.map +0 -1
  231. package/dist/admin/src/components/MediaLibraryInput/NoLibraryAccessDialog.d.ts +0 -10
@@ -1,13 +1,21 @@
1
+ /**
2
+ * `bar` on an empty field, `tile` after a multiple field's cards, `stacked`
3
+ * below them when the field is too narrow for both on one row.
4
+ */
5
+ export type ZoneVariant = 'bar' | 'tile' | 'stacked';
1
6
  interface AssetDropZoneProps {
7
+ variant?: ZoneVariant;
2
8
  disabled?: boolean;
3
- onClick: () => void;
4
9
  onDropFiles: (files: globalThis.File[]) => void;
5
10
  }
6
11
  /**
7
- * The field's own drop target. Deliberately not the Media Library page's
12
+ * The field's own drop target. It only takes drops: browsing and picking files
13
+ * go through the "Add asset" menu, so the field has one way in, not two.
14
+ *
15
+ * Deliberately not the Media Library page's
8
16
  * `UploadDropZoneProvider`: that one covers a whole route and paints a
9
17
  * full-surface overlay, where this has to stay inside one field on a form that
10
18
  * may hold several of them.
11
19
  */
12
- export declare const AssetDropZone: ({ disabled, onClick, onDropFiles }: AssetDropZoneProps) => import("react/jsx-runtime").JSX.Element;
20
+ export declare const AssetDropZone: ({ variant, disabled, onDropFiles, }: AssetDropZoneProps) => import("react/jsx-runtime").JSX.Element;
13
21
  export {};
@@ -0,0 +1,17 @@
1
+ import type { File } from '../../../../shared/contracts/files';
2
+ type PreviewSize = 'S' | 'L';
3
+ interface AssetPreviewProps {
4
+ asset: File;
5
+ size: PreviewSize;
6
+ }
7
+ export declare const AssetPreview: ({ asset, size }: AssetPreviewProps) => import("react/jsx-runtime").JSX.Element;
8
+ interface UploadPreviewProps {
9
+ file?: globalThis.File;
10
+ size: PreviewSize;
11
+ }
12
+ /**
13
+ * Previews a file that has not reached the server yet, straight from the
14
+ * user's disk.
15
+ */
16
+ export declare const UploadPreview: ({ file, size }: UploadPreviewProps) => import("react/jsx-runtime").JSX.Element;
17
+ export {};
@@ -1,3 +1,4 @@
1
+ import type { FieldUpload } from './useFieldUploads';
1
2
  import type { File } from '../../../../shared/contracts/files';
2
3
  interface AssetRowProps {
3
4
  asset: File;
@@ -7,9 +8,18 @@ interface AssetRowProps {
7
8
  onRemove: (asset: File) => void;
8
9
  }
9
10
  /**
10
- * One asset already held by the field. The uploading and failed variants the
11
- * design also specifies are not here yet — while an upload runs, the global
12
- * progress dialog is what reports it.
11
+ * The asset a single-value field holds.
13
12
  */
14
13
  export declare const AssetRow: ({ asset, disabled, onCopyLink, onEdit, onRemove, }: AssetRowProps) => import("react/jsx-runtime").JSX.Element;
14
+ interface UploadRowProps {
15
+ upload: FieldUpload;
16
+ disabled?: boolean;
17
+ onCancel: (upload: FieldUpload) => void;
18
+ onRetry: (upload: FieldUpload) => void;
19
+ onRemove: (upload: FieldUpload) => void;
20
+ }
21
+ /**
22
+ * A file a single-value field is uploading, or failed to upload.
23
+ */
24
+ export declare const UploadRow: ({ upload, disabled, onCancel, onRetry, onRemove, }: UploadRowProps) => import("react/jsx-runtime").JSX.Element;
15
25
  export {};
@@ -0,0 +1,19 @@
1
+ import { Menu } from '@strapi/design-system';
2
+ /**
3
+ * A ghost `IconButton` that stays a bare icon when disabled. The design system
4
+ * paints every disabled button, ghost included, as a bordered grey plate.
5
+ */
6
+ export declare const GhostIconButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("styled-components").FastOmit<Omit<Omit<import("@strapi/design-system").IconButtonProps<import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements>>, "ref"> & import("react").RefAttributes<unknown>, "ref"> & {
7
+ ref?: ((instance: unknown) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<unknown> | null | undefined;
8
+ }, string | number | symbol> & Omit<Omit<import("@strapi/design-system").IconButtonProps<import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements>>, "ref"> & import("react").RefAttributes<unknown>, "ref"> & {
9
+ ref?: ((instance: unknown) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<unknown> | null | undefined;
10
+ }, "variant"> & Partial<Pick<import("styled-components").FastOmit<Omit<Omit<import("@strapi/design-system").IconButtonProps<import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements>>, "ref"> & import("react").RefAttributes<unknown>, "ref"> & {
11
+ ref?: ((instance: unknown) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<unknown> | null | undefined;
12
+ }, string | number | symbol> & Omit<Omit<import("@strapi/design-system").IconButtonProps<import("react").ElementType<any, keyof import("react").JSX.IntrinsicElements>>, "ref"> & import("react").RefAttributes<unknown>, "ref"> & {
13
+ ref?: ((instance: unknown) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<unknown> | null | undefined;
14
+ }, "variant">>> & string & Omit<(<C extends React.ElementType<any, keyof React.JSX.IntrinsicElements> = "button">(props: React.PropsWithoutRef<import("@strapi/design-system").IconButtonProps<C>> & React.RefAttributes<unknown>) => React.ReactNode), keyof import("react").Component<any, {}, any>>;
15
+ /**
16
+ * A `Menu.Item` whose label greys out with its icon when disabled. The design
17
+ * system computes a disabled text colour, then its own stylesheet overrides it.
18
+ */
19
+ export declare const FieldMenuItem: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<Menu.ItemProps<(props: Omit<import("@strapi/design-system").BaseLinkProps<"a">, "ref"> & React.RefAttributes<HTMLAnchorElement>) => React.ReactNode> & import("styled-components/dist/types").BaseObject, never> & Partial<Pick<Menu.ItemProps<(props: Omit<import("@strapi/design-system").BaseLinkProps<"a">, "ref"> & React.RefAttributes<HTMLAnchorElement>) => React.ReactNode> & import("styled-components/dist/types").BaseObject, never>>> & string & Omit<({ onSelect, disabled, isLink, startIcon, endIcon, isExternal, variant, ...props }: Menu.ItemProps) => import("react/jsx-runtime").JSX.Element, keyof import("react").Component<any, {}, any>>;
@@ -11,6 +11,8 @@ export interface MediaLibraryInputProps {
11
11
  allowedTypes?: AllowedMediaType[] | null;
12
12
  multiple?: boolean;
13
13
  };
14
+ /** The field's width in the edit layout, out of 12. Set by the Content Manager. */
15
+ layoutSize?: number;
14
16
  }
15
17
  /**
16
18
  * The Content Manager's `media` field, on the current Media Library stack.
@@ -23,4 +25,4 @@ export interface MediaLibraryInputProps {
23
25
  * The legacy input is still registered when `useLegacyMediaLibrary` is on, and
24
26
  * is untouched by this.
25
27
  */
26
- export declare const MediaLibraryInput: ({ name, label, labelAction, hint, required, disabled, attribute, }: MediaLibraryInputProps) => import("react/jsx-runtime").JSX.Element;
28
+ export declare const MediaLibraryInput: ({ name, label, labelAction, hint, required, disabled, attribute, layoutSize, }: MediaLibraryInputProps) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,7 @@
1
+ interface UploadProgressBarProps {
2
+ /** 0–100, or `null` for an upload whose size is not known. */
3
+ progress: number | null;
4
+ label: string;
5
+ }
6
+ export declare const UploadProgressBar: ({ progress, label }: UploadProgressBarProps) => import("react/jsx-runtime").JSX.Element;
7
+ export {};
@@ -0,0 +1,31 @@
1
+ export interface FieldUpload {
2
+ key: string;
3
+ uploadId: number;
4
+ index: number;
5
+ name: string;
6
+ status: 'uploading' | 'failed';
7
+ /** 0–100, or `null` while the size is unknown. */
8
+ progress: number | null;
9
+ /** The file the user picked, for the preview. Gone once the page reloads. */
10
+ sourceFile?: globalThis.File;
11
+ /** Whether the progress store still holds the row, i.e. it can be retried in place. */
12
+ isInStore: boolean;
13
+ }
14
+ /**
15
+ * The uploads a field started, read from the shared progress store so the field
16
+ * and the progress dialog always agree.
17
+ *
18
+ * The store only holds the latest batch, and closing the dialog empties it. Rows
19
+ * are therefore remembered here once seen: a failed upload stays on the field
20
+ * until the user retries or removes it, whatever happened to the dialog. A row
21
+ * that vanished while still in flight was cancelled along with its batch.
22
+ *
23
+ * Completed rows leave the list. Attaching them to the field is the upload's
24
+ * `onFileUploaded`, which outlives the input.
25
+ */
26
+ export declare const useFieldUploads: (owner: string) => {
27
+ uploads: FieldUpload[];
28
+ cancel: ({ uploadId, index }: FieldUpload) => void;
29
+ retry: (upload: FieldUpload, reupload: (file: globalThis.File) => void) => Promise<void>;
30
+ dismiss: (key: string) => void;
31
+ };
@@ -6,6 +6,8 @@
6
6
  * hook is what keeps the UI honest so users don't discover a missing
7
7
  * permission through a 403.
8
8
  *
9
+ * - `canRead` — browse the library (the Content Manager asset picker needs
10
+ * nothing more)
9
11
  * - `canCreate` — upload (files, from URL) and New folder
10
12
  * - `canUpdate` — edit details, replace, crop, move (dnd + bulk), delete
11
13
  * (single + bulk), AI metadata — the `assets.update` action covers
@@ -3,10 +3,12 @@ import type { File } from '../../../../../shared/contracts/files';
3
3
  import type { Folder } from '../../../../../shared/contracts/folders';
4
4
  interface AssetsGridProps {
5
5
  assets: File[];
6
+ /** Shown in the "Assets (n)" heading; falls back to the loaded count. */
7
+ assetsTotal?: number;
6
8
  folders?: Folder[];
7
9
  /** Keys of the rendered items, in render order. Owned by the view. */
8
10
  renderedKeys?: ItemKey[];
9
11
  onAssetItemClick: (assetId: number) => void;
10
12
  }
11
- export declare const AssetsGrid: ({ assets, folders, renderedKeys, onAssetItemClick, }: AssetsGridProps) => import("react/jsx-runtime").JSX.Element | null;
13
+ export declare const AssetsGrid: ({ assets, assetsTotal, folders, renderedKeys, onAssetItemClick, }: AssetsGridProps) => import("react/jsx-runtime").JSX.Element | null;
12
14
  export {};
@@ -1,5 +1,15 @@
1
+ interface AssetsSearchInputProps {
2
+ /**
3
+ * Starts as an icon button that opens the field, which folds back once it
4
+ * loses focus empty, like the admin's own `SearchInput` in list views. Used
5
+ * where the toolbar is narrow (the Content Manager asset picker). Mobile
6
+ * always shows the field.
7
+ */
8
+ collapsible?: boolean;
9
+ }
1
10
  /**
2
11
  * Keyword search over the whole Media Library. Owns the typing state and the
3
12
  * debounce; `useAssetSearch` owns the `?_q=` URL param.
4
13
  */
5
- export declare const AssetsSearchInput: () => import("react/jsx-runtime").JSX.Element;
14
+ export declare const AssetsSearchInput: ({ collapsible }: AssetsSearchInputProps) => import("react/jsx-runtime").JSX.Element;
15
+ export {};
@@ -0,0 +1,29 @@
1
+ import { type ItemLocations } from '../../../utils/itemLocations';
2
+ import { type FoldersPosition } from '../hooks/useListSort';
3
+ import type { File } from '../../../../../shared/contracts/files';
4
+ import type { Folder } from '../../../../../shared/contracts/folders';
5
+ interface AssetsViewProps {
6
+ view: number;
7
+ folders: Folder[];
8
+ isLoadingFolders: boolean;
9
+ assets: File[];
10
+ /** Total matching assets on the server, beyond the pages loaded so far. */
11
+ assetsTotal?: number;
12
+ isLoadingAssets: boolean;
13
+ isFetchingMore: boolean;
14
+ hasNextPage: boolean;
15
+ fetchNextPage: () => void;
16
+ error: unknown;
17
+ locations: ItemLocations;
18
+ searchQuery: string;
19
+ assetsSort: string;
20
+ foldersPosition: FoldersPosition;
21
+ hasActiveFilters: boolean;
22
+ onClearFilters: () => void;
23
+ onAssetItemClick: (assetId: number) => void;
24
+ onAddAssets: () => void;
25
+ canAddAssets: boolean;
26
+ onClearSearch: () => void;
27
+ }
28
+ export declare const AssetsView: ({ view, folders, isLoadingFolders, assets, assetsTotal, isLoadingAssets, isFetchingMore, hasNextPage, fetchNextPage, error, locations, searchQuery, assetsSort, foldersPosition, hasActiveFilters, onClearFilters, onAssetItemClick, onAddAssets, canAddAssets, onClearSearch, }: AssetsViewProps) => import("react/jsx-runtime").JSX.Element;
29
+ export {};
@@ -0,0 +1,12 @@
1
+ import { type AssetSortable } from './assetSortable';
2
+ interface ReorderHandleProps {
3
+ name: string;
4
+ handle: AssetSortable['handle'];
5
+ }
6
+ /**
7
+ * The keyboard path into reordering (Space picks the item up, arrows move it,
8
+ * Space drops it). Pointer drags start from anywhere on the item, this grip
9
+ * included.
10
+ */
11
+ export declare const ReorderHandle: ({ name, handle }: ReorderHandleProps) => import("react/jsx-runtime").JSX.Element;
12
+ export {};
@@ -0,0 +1,37 @@
1
+ import { type CSSProperties, type KeyboardEvent, type SyntheticEvent } from 'react';
2
+ import type { DraggableAttributes, DraggableSyntheticListeners } from '@dnd-kit/core';
3
+ /**
4
+ * What a list item needs to take part in reordering: the whole item drags with
5
+ * the pointer, and a grip button carries the keyboard path (Space to pick up,
6
+ * arrows to move) so it doesn't collide with the item's own Space/click.
7
+ */
8
+ export interface AssetSortable {
9
+ setNodeRef: (node: HTMLElement | null) => void;
10
+ isDragging: boolean;
11
+ style: CSSProperties;
12
+ /** Pointer activation, for the item itself. */
13
+ listeners: DraggableSyntheticListeners;
14
+ handle: Partial<DraggableAttributes> & {
15
+ ref: (node: HTMLElement | null) => void;
16
+ onKeyDown?: (event: KeyboardEvent) => void;
17
+ };
18
+ }
19
+ type UseAssetSortable = (assetId: number) => AssetSortable | null;
20
+ /**
21
+ * Holds the hook that makes an asset sortable, rather than a value: the hook
22
+ * needs each item's id. A given subtree always gets the same hook, so calling
23
+ * it from `useAssetSortable` keeps the rules of hooks.
24
+ */
25
+ export declare const AssetSortableContext: import("react").Context<UseAssetSortable>;
26
+ export declare const useAssetSortable: (assetId: number) => AssetSortable | null;
27
+ /** Marks the reorder grip, so the item can tell its keys apart. */
28
+ export declare const REORDER_HANDLE_PROPS: {
29
+ "data-reorder-handle": string;
30
+ };
31
+ /**
32
+ * Keys pressed on the grip, including the arrows and the drop key mid-drag,
33
+ * belong to reordering. The item must not also read them as its own
34
+ * Enter/Space.
35
+ */
36
+ export declare const isFromReorderHandle: (event: SyntheticEvent) => boolean;
37
+ export {};
@@ -3,5 +3,10 @@ export declare const toFolderDraggableId: (id: number) => `folder:${number}`;
3
3
  export declare const toFolderTargetId: (id: number) => `folder-target:${number}`;
4
4
  export declare const parseFolderTargetId: (dndId: string | number) => number | null;
5
5
  export declare const toFolderTreeTargetId: (id: number) => `folder-tree-target:${number}`;
6
+ /**
7
+ * The "N parent folders" row in the sidebar. Only there so hovering it during a
8
+ * drag opens it; no parser recognises it, so a drop on it moves nothing.
9
+ */
10
+ export declare const toFolderTreeSummaryId: (rootId: number) => `folder-tree-summary:${number}`;
6
11
  export declare const HOME_TREE_TARGET_ID: "folder-tree-target:home";
7
12
  export declare const parseFolderTreeTargetId: (dndId: string | number) => number | "root" | null;
@@ -1,3 +1,4 @@
1
+ import { type DraggableAttributes } from '@dnd-kit/core';
1
2
  import type { DragFileData, DragFolderData } from '../../../../types/dnd';
2
3
  export declare const useFileDraggable: (asset: {
3
4
  id: number;
@@ -6,11 +7,31 @@ export declare const useFileDraggable: (asset: {
6
7
  id?: number;
7
8
  } | null;
8
9
  }) => {
10
+ setNodeRef: (node: HTMLElement | null) => void;
11
+ isDragging: boolean;
12
+ listeners: import("@dnd-kit/core").DraggableSyntheticListeners;
13
+ dragStyle: import("react").CSSProperties;
14
+ dragHandle: Partial<DraggableAttributes> & {
15
+ ref: (node: HTMLElement | null) => void;
16
+ onKeyDown?: (event: import("react").KeyboardEvent) => void;
17
+ };
18
+ dragData: DragFileData;
19
+ active: import("@dnd-kit/core").Active | null;
20
+ activatorEvent: Event | null;
21
+ activeNodeRect: import("@dnd-kit/core").ClientRect | null;
22
+ attributes: DraggableAttributes;
23
+ node: import("react").MutableRefObject<HTMLElement | null>;
24
+ over: import("@dnd-kit/core").Over | null;
25
+ setActivatorNodeRef: (element: HTMLElement | null) => void;
26
+ transform: import("@dnd-kit/utilities").Transform | null;
27
+ } | {
28
+ dragStyle: undefined;
29
+ dragHandle: undefined;
9
30
  dragData: DragFileData;
10
31
  active: import("@dnd-kit/core").Active | null;
11
32
  activatorEvent: Event | null;
12
33
  activeNodeRect: import("@dnd-kit/core").ClientRect | null;
13
- attributes: import("@dnd-kit/core").DraggableAttributes;
34
+ attributes: DraggableAttributes;
14
35
  isDragging: boolean;
15
36
  listeners: import("@dnd-kit/core/dist/hooks/utilities").SyntheticListenerMap | undefined;
16
37
  node: import("react").MutableRefObject<HTMLElement | null>;
@@ -31,7 +52,7 @@ export declare const useFolderDraggableDroppable: (folder: {
31
52
  active: import("@dnd-kit/core").Active | null;
32
53
  activatorEvent: Event | null;
33
54
  activeNodeRect: import("@dnd-kit/core").ClientRect | null;
34
- attributes: import("@dnd-kit/core").DraggableAttributes;
55
+ attributes: DraggableAttributes;
35
56
  isDragging: boolean;
36
57
  listeners: import("@dnd-kit/core/dist/hooks/utilities").SyntheticListenerMap | undefined;
37
58
  node: import("react").MutableRefObject<HTMLElement | null>;
@@ -1,4 +1,5 @@
1
1
  import { type ReactNode } from 'react';
2
+ export declare const getIndentRem: (level: number) => number;
2
3
  interface FolderTreeProps {
3
4
  currentFolderId: number | null;
4
5
  /**
@@ -0,0 +1,21 @@
1
+ import type { FolderNode } from '../../../../../../shared/contracts/folders';
2
+ /**
3
+ * Depth (0 = a root folder) from which the selected folder's ancestors fold into
4
+ * a single "N parent folders" row in the sidebar. Picked so the deepest visible
5
+ * row still has room for a readable name in the 23.2rem rail.
6
+ */
7
+ export declare const COLLAPSE_FROM_DEPTH = 4;
8
+ export interface CollapsedBranch {
9
+ root: FolderNode;
10
+ /** Between `root` and `parent`, shallowest first. */
11
+ hidden: FolderNode[];
12
+ /** The selected folder's parent. */
13
+ parent: FolderNode;
14
+ }
15
+ /**
16
+ * How the selected folder's branch folds once it is deep enough: the root stays,
17
+ * everything between the root and the parent is hidden, and the parent stays so
18
+ * the selected folder is shown alongside its siblings. `null` means the branch
19
+ * renders in full.
20
+ */
21
+ export declare const getCollapsedBranch: (nodes: FolderNode[], selectedId: number | null) => CollapsedBranch | null;
@@ -0,0 +1,8 @@
1
+ interface ViewToggleProps {
2
+ view: number;
3
+ onChange: (view: number) => void;
4
+ /** Drops the visible labels at every width, for narrow hosts like a modal. */
5
+ iconsOnly?: boolean;
6
+ }
7
+ export declare const ViewToggle: ({ view, onChange, iconsOnly }: ViewToggleProps) => import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -12,7 +12,21 @@ import { type ItemKey } from '../utils/selection';
12
12
  * ordered key array from the caller (the view owns the rendered order), keeping
13
13
  * the context data-source-agnostic.
14
14
  */
15
+ /**
16
+ * How an item takes part in selection: `enabled` shows a working checkbox,
17
+ * `disabled` shows it greyed out (the item cannot be chosen here), `hidden`
18
+ * shows none (the item is not something this selection is about).
19
+ */
20
+ export type Selectability = 'enabled' | 'disabled' | 'hidden';
15
21
  export interface AssetSelection {
22
+ /**
23
+ * Whether selection is on at all. Views show the checkbox column and
24
+ * select-all only when it is.
25
+ */
26
+ isEnabled: boolean;
27
+ /** Whether the table offers a select-all header (not on a single-value picker). */
28
+ canSelectAll: boolean;
29
+ getSelectability: (key: ItemKey) => Selectability;
16
30
  /** Every selected item key (assets and folders), render-order agnostic. */
17
31
  selectedKeys: Set<ItemKey>;
18
32
  /** Selected asset ids, derived from {@link selectedKeys}. */
@@ -34,9 +48,21 @@ export interface AssetSelection {
34
48
  selectOnly: (key: ItemKey) => void;
35
49
  /** Row-level "..." menu — drops one key when its item leaves the list (move, delete). */
36
50
  deselect: (key: ItemKey) => void;
51
+ /**
52
+ * Header checkbox, when everything it covers is selected. The host decides how
53
+ * far that reaches: the Media Library page clears the whole selection, because
54
+ * it can still hold keys that left the list without being deselected (moved or
55
+ * deleted from the details drawer). The picker drops only these keys.
56
+ */
57
+ deselectAll: (orderedKeys: ItemKey[]) => void;
37
58
  /** Close button / folder navigation / list-identity changes. */
38
59
  clear: () => void;
39
60
  }
61
+ /**
62
+ * Exported so a host with its own selection rules (the Content Manager asset
63
+ * picker) can feed the same views a different implementation.
64
+ */
65
+ export declare const AssetSelectionContext: import("react").Context<AssetSelection | null>;
40
66
  interface AssetSelectionProviderProps {
41
67
  children: ReactNode;
42
68
  /**
@@ -0,0 +1,30 @@
1
+ /**
2
+ * The list behind the Media Library page and the Content Manager asset picker:
3
+ * the current folder, search, sort and filters, and the folders and assets they
4
+ * select. Where that query state lives (URL or memory) is decided by
5
+ * `ListQueryStateProvider`, not here.
6
+ */
7
+ export declare const useAssetsList: () => {
8
+ listSort: import("./useListSort").ListSort;
9
+ listFilters: import("./useListFilters").ListFilters;
10
+ assets: import("../../../../../shared/contracts/files").File[];
11
+ subscribers: import("react").FunctionComponentElement<{
12
+ children?: import("react").ReactNode | undefined;
13
+ }> | null;
14
+ pagination: import("../../../../../shared/contracts/files").Pagination | undefined;
15
+ isLoadingAssets: boolean;
16
+ isFetchingMore: boolean;
17
+ hasNextPage: boolean;
18
+ fetchNextPage: () => void;
19
+ assetsError: import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError | undefined;
20
+ folders: import("../../../../../shared/contracts/folders").Folder[];
21
+ isLoadingFolders: boolean;
22
+ searchQuery: string;
23
+ isSearching: boolean;
24
+ setSearchQuery: (value: string) => void;
25
+ clearSearch: () => void;
26
+ currentFolderId: number | null;
27
+ navigateToFolder: (folder: import("../../../../../shared/contracts/folders").Folder) => void;
28
+ navigateToRoot: () => void;
29
+ navigateToFolderId: (folderId: number | null) => void;
30
+ };
@@ -0,0 +1,27 @@
1
+ import { type Dispatch, type ReactNode, type SetStateAction } from 'react';
2
+ interface ListQueryState {
3
+ search: string;
4
+ setSearch: Dispatch<SetStateAction<string>>;
5
+ }
6
+ interface ListQueryStateProviderProps {
7
+ children: ReactNode;
8
+ }
9
+ /**
10
+ * Keeps the list query (folder, search, filters, sort) in memory instead of the
11
+ * URL, for surfaces hosted inside another page — the Content Manager asset
12
+ * picker would otherwise overwrite the entry's own URL. Without this provider,
13
+ * `useListQueryParams` falls back to the URL, which is what the Media Library
14
+ * page relies on.
15
+ */
16
+ export declare const ListQueryStateProvider: ({ children }: ListQueryStateProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<ListQueryState | null>>;
17
+ /**
18
+ * Drop-in for `useQueryParams` used by the list hooks. The in-memory store keeps
19
+ * a serialized search string and goes through the same `qs` round trip as the
20
+ * URL, so callers that pre-encode values (`withEncodedUserParams`,
21
+ * `encodeSearchQuery`) read back exactly what they would from the URL.
22
+ */
23
+ export declare const useListQueryParams: <TQuery extends object>() => readonly [{
24
+ readonly query: TQuery;
25
+ readonly rawQuery: string;
26
+ }, (nextParams: TQuery, method?: "push" | "remove", replace?: boolean) => void];
27
+ export {};
@@ -0,0 +1,29 @@
1
+ import { type ReactNode } from 'react';
2
+ interface ListSettings {
3
+ /**
4
+ * Management affordances on list items: the right-click menu and the bulk
5
+ * actions bar. A picker hosted elsewhere (the Content Manager asset picker)
6
+ * turns them off — choosing an asset is not the place to delete or move it.
7
+ */
8
+ showItemActions: boolean;
9
+ /**
10
+ * "Folders (n)" / "Assets (n)" headings above each grid section, with a
11
+ * divider between them. The page carries the count in its own header instead.
12
+ */
13
+ showSectionHeadings: boolean;
14
+ /** Narrowest a grid tile may get before the grid drops a column. */
15
+ gridMinTileWidth: string;
16
+ /**
17
+ * A "Select all" checkbox beside the grid's "Assets (n)" heading, the grid's
18
+ * counterpart of the table's header checkbox. The page reaches select-all
19
+ * from its bulk actions bar instead.
20
+ */
21
+ showGridSelectAll: boolean;
22
+ }
23
+ interface ListSettingsProviderProps extends Partial<ListSettings> {
24
+ children: ReactNode;
25
+ }
26
+ export declare const ListSettingsProvider: ({ children, showItemActions, showSectionHeadings, gridMinTileWidth, showGridSelectAll, }: ListSettingsProviderProps) => import("react").FunctionComponentElement<import("react").ProviderProps<ListSettings>>;
27
+ /** Without a provider, returns the Media Library page's settings. */
28
+ export declare const useListSettings: () => ListSettings;
29
+ export {};
@@ -15,6 +15,8 @@ interface UploadFilesArgs {
15
15
  * a later retry uploads after the call itself has resolved.
16
16
  */
17
17
  onFileUploaded?: (file: UploadedFile) => void;
18
+ /** Tags the batch's rows in the progress store, see `FileProgress.owner`. */
19
+ owner?: string;
18
20
  }
19
21
  interface UploadFromUrlsArgs {
20
22
  urls: string[];
@@ -37,6 +39,16 @@ interface UploadEntry {
37
39
  * Called from the UploadProgressDialog when the user clicks cancel or close.
38
40
  */
39
41
  export declare const abortUpload: (uploadId: number) => void;
42
+ /**
43
+ * Aborts one file of a batch. Pair it with `cancelFile` to mark the row, the
44
+ * same way `abortUpload` pairs with `cancelUpload`.
45
+ */
46
+ export declare const abortUploadFile: (uploadId: number, index: number) => void;
47
+ /**
48
+ * The file the user picked for a row, kept so it can be previewed while it
49
+ * uploads and replayed on retry.
50
+ */
51
+ export declare const getUploadSourceFile: (uploadId: number, index: number) => File | undefined;
40
52
  /**
41
53
  * Kicks off AI metadata generation for a freshly uploaded file.
42
54
  *
@@ -79,6 +91,14 @@ declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/t
79
91
  * through the same upload pool with a fresh AbortController.
80
92
  */
81
93
  retryCancelledFiles: import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
94
+ /**
95
+ * Retry one cancelled or failed file of the current batch. Queued behind
96
+ * whatever the batch still has in flight, so `concurrency` keeps holding.
97
+ */
98
+ retryUploadFile: import("@reduxjs/toolkit/query").MutationDefinition<{
99
+ uploadId: number;
100
+ index: number;
101
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">;
82
102
  /**
83
103
  * Upload files from URLs.
84
104
  * Sends URLs to the server which fetches and uploads them (SSE flow, unchanged).
@@ -99,7 +119,10 @@ declare const uploadApi: import("@reduxjs/toolkit/query").Api<import("@reduxjs/t
99
119
  fileIds: number[];
100
120
  }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", GenerateAIMetadata.FileResult[], "adminApi">;
101
121
  }, "adminApi", "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", typeof import("@reduxjs/toolkit/query").coreModuleName | typeof import("@reduxjs/toolkit/dist/query/react").reactHooksModuleName>;
102
- export declare const useUploadFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFileSilentlyMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">>, useRetryCancelledFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFromUrlsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">>, useGenerateAiMetadataMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
122
+ export declare const useUploadFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFilesArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFileSilentlyMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadEntry, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile, "adminApi">>, useRetryCancelledFilesMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<void, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useRetryUploadFileMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
123
+ uploadId: number;
124
+ index: number;
125
+ }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", UploadedFile[], "adminApi">>, useUploadFromUrlsMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<UploadFromUrlsArgs, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", CreateFilesStream.Response, "adminApi">>, useGenerateAiMetadataMutation: import("@reduxjs/toolkit/dist/query/react/buildHooks").UseMutation<import("@reduxjs/toolkit/query").MutationDefinition<{
103
126
  fileIds: number[];
104
127
  }, import("@reduxjs/toolkit/query").BaseQueryFn<string | import("@strapi/admin/strapi-admin").QueryArguments, unknown, import("@strapi/admin/strapi-admin").BaseQueryError | import("@reduxjs/toolkit").SerializedError, {}, {}>, "GuidedTourMeta" | "HomepageKeyStatistics" | "AiUsage" | "AiFeatureConfig" | "Asset" | "Folder", GenerateAIMetadata.FileResult[], "adminApi">>;
105
128
  export { uploadApi };
@@ -23,6 +23,11 @@ export interface FileProgress {
23
23
  completedAt?: number;
24
24
  error?: string;
25
25
  metadataStatus?: FileMetadataStatus;
26
+ /**
27
+ * Who started the row, when that is not the progress dialog alone. The Content
28
+ * Manager field tags its own uploads so it can show their state in place.
29
+ */
30
+ owner?: string;
26
31
  }
27
32
  export interface UploadProgressState {
28
33
  isVisible: boolean;
@@ -157,10 +162,12 @@ export declare const openUploadProgress: import("@reduxjs/toolkit").ActionCreato
157
162
  totalFiles: number;
158
163
  fileNames: string[];
159
164
  fileSizes?: number[];
165
+ owner?: string;
160
166
  }, "uploadProgress/openUploadProgress">, appendUploadFiles: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
161
167
  uploadId: number;
162
168
  fileNames: string[];
163
169
  fileSizes?: number[];
170
+ owner?: string;
164
171
  }, "uploadProgress/appendUploadFiles">, setFileUploading: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
165
172
  name: string;
166
173
  index: number;
@@ -190,7 +197,13 @@ export declare const openUploadProgress: import("@reduxjs/toolkit").ActionCreato
190
197
  status: FileMetadataResultStatus;
191
198
  }, "uploadProgress/setFileMetadataResult">, addUploadErrors: import("@reduxjs/toolkit").ActionCreatorWithPayload<FileUploadError[], "uploadProgress/addUploadErrors">, closeUploadProgress: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/closeUploadProgress">, toggleMinimize: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/toggleMinimize">, cancelUpload: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/cancelUpload">, setUploadFailed: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
192
199
  message: string;
193
- }, "uploadProgress/setUploadFailed">, retryCancelledFiles: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/retryCancelledFiles">;
200
+ }, "uploadProgress/setUploadFailed">, cancelFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
201
+ index: number;
202
+ uploadId: number;
203
+ }, "uploadProgress/cancelFile">, retryFile: import("@reduxjs/toolkit").ActionCreatorWithPayload<{
204
+ index: number;
205
+ uploadId: number;
206
+ }, "uploadProgress/retryFile">, retryCancelledFiles: import("@reduxjs/toolkit").ActionCreatorWithoutPayload<"uploadProgress/retryCancelledFiles">;
194
207
  /**
195
208
  * The merge/reset switch. Errored and cancelled rows count as settled, so a
196
209
  * batch that finished badly is still replaced by the next drop.
@@ -0,0 +1,6 @@
1
+ import type { FolderNode } from '../../../shared/contracts/folders';
2
+ /**
3
+ * The chain of folders from the library root down to `targetId`, inclusive, or
4
+ * `null` when the folder is not in the tree (deleted, or not loaded yet).
5
+ */
6
+ export declare const findFolderPath: (nodes: FolderNode[], targetId: number, trail?: FolderNode[]) => FolderNode[] | null;