@strapi/upload 5.48.0 → 5.49.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 (187) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +3 -2
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -1
  3. package/dist/admin/ai/components/AIUploadModal.js +3 -2
  4. package/dist/admin/ai/components/AIUploadModal.js.map +1 -1
  5. package/dist/admin/components/AssetCard/UploadingAssetCard.js +3 -2
  6. package/dist/admin/components/AssetCard/UploadingAssetCard.js.map +1 -1
  7. package/dist/admin/components/AssetCard/VideoAssetCard.js +3 -2
  8. package/dist/admin/components/AssetCard/VideoAssetCard.js.map +1 -1
  9. package/dist/admin/components/AssetDialog/AssetDialog.js +3 -2
  10. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  11. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js +3 -2
  12. package/dist/admin/components/AssetDialog/BrowseStep/Filters.js.map +1 -1
  13. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js +3 -2
  14. package/dist/admin/components/AssetDialog/BrowseStep/PaginationFooter/Pagination.js.map +1 -1
  15. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js +3 -2
  16. package/dist/admin/components/AssetDialog/BrowseStep/SearchAsset/SearchAsset.js.map +1 -1
  17. package/dist/admin/components/AssetGridList/Draggable.js +3 -2
  18. package/dist/admin/components/AssetGridList/Draggable.js.map +1 -1
  19. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -2
  20. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  21. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js +5 -1
  22. package/dist/admin/components/BulkMoveDialog/BulkMoveDialog.js.map +1 -1
  23. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +8 -4
  24. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  25. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js +7 -3
  26. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  27. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +7 -3
  28. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  29. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js +3 -2
  30. package/dist/admin/components/EditAssetDialog/ReplaceMediaButton.js.map +1 -1
  31. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js +8 -4
  32. package/dist/admin/components/EditFolderDialog/EditFolderDialog.js.map +1 -1
  33. package/dist/admin/components/FilterPopover/FilterPopover.js +3 -2
  34. package/dist/admin/components/FilterPopover/FilterPopover.js.map +1 -1
  35. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js +3 -2
  36. package/dist/admin/components/FolderCard/FolderCard/FolderCard.js.map +1 -1
  37. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js +5 -3
  38. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.js.map +1 -1
  39. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs +2 -1
  40. package/dist/admin/components/MediaLibraryDialog/MediaLibraryDialog.mjs.map +1 -1
  41. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +3 -2
  42. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  43. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js +3 -2
  44. package/dist/admin/components/MediaLibraryInput/Carousel/EmptyStateAsset.js.map +1 -1
  45. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js +3 -2
  46. package/dist/admin/components/MediaLibraryInput/MediaLibraryInput.js.map +1 -1
  47. package/dist/admin/components/SelectTree/SelectTree.js +7 -3
  48. package/dist/admin/components/SelectTree/SelectTree.js.map +1 -1
  49. package/dist/admin/components/TableList/CellContent.js +5 -1
  50. package/dist/admin/components/TableList/CellContent.js.map +1 -1
  51. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js +3 -2
  52. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromComputerForm.js.map +1 -1
  53. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js +3 -2
  54. package/dist/admin/components/UploadAssetDialog/AddAssetStep/FromUrlForm.js.map +1 -1
  55. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js +3 -2
  56. package/dist/admin/components/UploadAssetDialog/PendingAssetStep/PendingAssetStep.js.map +1 -1
  57. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js +3 -2
  58. package/dist/admin/components/UploadAssetDialog/UploadAssetDialog.js.map +1 -1
  59. package/dist/admin/future/components/Drawer.js +4 -3
  60. package/dist/admin/future/components/Drawer.js.map +1 -1
  61. package/dist/admin/future/pages/Assets/AssetsPage.js +29 -4
  62. package/dist/admin/future/pages/Assets/AssetsPage.js.map +1 -1
  63. package/dist/admin/future/pages/Assets/AssetsPage.mjs +28 -4
  64. package/dist/admin/future/pages/Assets/AssetsPage.mjs.map +1 -1
  65. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js +3 -2
  66. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetDetailsDrawer.js.map +1 -1
  67. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js +3 -2
  68. package/dist/admin/future/pages/Assets/components/AssetDetails/AssetPreview.js.map +1 -1
  69. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js +3 -2
  70. package/dist/admin/future/pages/Assets/components/DropZone/UploadDropZone.js.map +1 -1
  71. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js +389 -0
  72. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.js.map +1 -0
  73. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs +387 -0
  74. package/dist/admin/future/pages/Assets/components/FolderTree/FolderTree.mjs.map +1 -0
  75. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js +3 -2
  76. package/dist/admin/future/pages/Assets/components/ImportFromUrlDialog.js.map +1 -1
  77. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js +4 -4
  78. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.js.map +1 -1
  79. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs +4 -4
  80. package/dist/admin/future/pages/Assets/hooks/useFolderInfo.mjs.map +1 -1
  81. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js +48 -2
  82. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.js.map +1 -1
  83. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs +48 -2
  84. package/dist/admin/future/pages/Assets/hooks/useFolderNavigation.mjs.map +1 -1
  85. package/dist/admin/future/services/folders.js +28 -1
  86. package/dist/admin/future/services/folders.js.map +1 -1
  87. package/dist/admin/future/services/folders.mjs +28 -2
  88. package/dist/admin/future/services/folders.mjs.map +1 -1
  89. package/dist/admin/future/utils/files.js +5 -1
  90. package/dist/admin/future/utils/files.js.map +1 -1
  91. package/dist/admin/hooks/useAIMetadataJob.js +3 -2
  92. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -1
  93. package/dist/admin/hooks/useAssets.js +3 -2
  94. package/dist/admin/hooks/useAssets.js.map +1 -1
  95. package/dist/admin/hooks/useCropImg.js +7 -3
  96. package/dist/admin/hooks/useCropImg.js.map +1 -1
  97. package/dist/admin/hooks/useEditAsset.js +3 -2
  98. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  99. package/dist/admin/hooks/useFolders.js +3 -2
  100. package/dist/admin/hooks/useFolders.js.map +1 -1
  101. package/dist/admin/hooks/useModalQueryParams.js +3 -2
  102. package/dist/admin/hooks/useModalQueryParams.js.map +1 -1
  103. package/dist/admin/hooks/useSelectionState.js +3 -2
  104. package/dist/admin/hooks/useSelectionState.js.map +1 -1
  105. package/dist/admin/hooks/useUpload.js +3 -2
  106. package/dist/admin/hooks/useUpload.js.map +1 -1
  107. package/dist/admin/pages/App/App.js +3 -2
  108. package/dist/admin/pages/App/App.js.map +1 -1
  109. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +7 -3
  110. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  111. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js +7 -2
  112. package/dist/admin/pages/App/ConfigureTheView/state/reducer.js.map +1 -1
  113. package/dist/admin/pages/App/MediaLibrary.js +3 -2
  114. package/dist/admin/pages/App/MediaLibrary.js.map +1 -1
  115. package/dist/admin/pages/App/components/BulkMoveButton.js +3 -2
  116. package/dist/admin/pages/App/components/BulkMoveButton.js.map +1 -1
  117. package/dist/admin/pages/App/components/Filters.js +3 -2
  118. package/dist/admin/pages/App/components/Filters.js.map +1 -1
  119. package/dist/admin/pages/SettingsPage/SettingsPage.js +7 -3
  120. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  121. package/dist/admin/pages/SettingsPage/reducer.js +5 -1
  122. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  123. package/dist/admin/src/components/MediaLibraryDialog/MediaLibraryDialog.d.ts +2 -1
  124. package/dist/admin/src/future/pages/Assets/components/FolderTree/FolderTree.d.ts +19 -0
  125. package/dist/admin/src/future/pages/Assets/hooks/useFolderNavigation.d.ts +2 -0
  126. package/dist/admin/src/future/services/folders.d.ts +2 -2
  127. package/dist/admin/translations/en.json.js +10 -1
  128. package/dist/admin/translations/en.json.js.map +1 -1
  129. package/dist/admin/translations/en.json.mjs +10 -1
  130. package/dist/admin/translations/en.json.mjs.map +1 -1
  131. package/dist/admin/utils/formatBytes.js +5 -1
  132. package/dist/admin/utils/formatBytes.js.map +1 -1
  133. package/dist/admin/utils/urlYupSchema.js +3 -2
  134. package/dist/admin/utils/urlYupSchema.js.map +1 -1
  135. package/dist/server/controllers/admin-upload.js +11 -4
  136. package/dist/server/controllers/admin-upload.js.map +1 -1
  137. package/dist/server/controllers/content-api.js +19 -2
  138. package/dist/server/controllers/content-api.js.map +1 -1
  139. package/dist/server/controllers/content-api.mjs +12 -0
  140. package/dist/server/controllers/content-api.mjs.map +1 -1
  141. package/dist/server/controllers/utils/find-entity-and-check-permissions.js +7 -3
  142. package/dist/server/controllers/utils/find-entity-and-check-permissions.js.map +1 -1
  143. package/dist/server/middlewares/upload.js +7 -2
  144. package/dist/server/middlewares/upload.js.map +1 -1
  145. package/dist/server/register.js +9 -4
  146. package/dist/server/register.js.map +1 -1
  147. package/dist/server/routes/content-api.js +18 -2
  148. package/dist/server/routes/content-api.js.map +1 -1
  149. package/dist/server/routes/content-api.mjs +15 -0
  150. package/dist/server/routes/content-api.mjs.map +1 -1
  151. package/dist/server/routes/validation/upload.js +31 -2
  152. package/dist/server/routes/validation/upload.js.map +1 -1
  153. package/dist/server/routes/validation/upload.mjs +28 -0
  154. package/dist/server/routes/validation/upload.mjs.map +1 -1
  155. package/dist/server/services/file.js +13 -6
  156. package/dist/server/services/file.js.map +1 -1
  157. package/dist/server/services/image-manipulation.js +18 -12
  158. package/dist/server/services/image-manipulation.js.map +1 -1
  159. package/dist/server/services/provider.js +24 -0
  160. package/dist/server/services/provider.js.map +1 -1
  161. package/dist/server/services/provider.mjs +24 -0
  162. package/dist/server/services/provider.mjs.map +1 -1
  163. package/dist/server/services/upload.js +187 -31
  164. package/dist/server/services/upload.js.map +1 -1
  165. package/dist/server/services/upload.mjs +159 -11
  166. package/dist/server/services/upload.mjs.map +1 -1
  167. package/dist/server/src/controllers/content-api.d.ts +1 -0
  168. package/dist/server/src/controllers/content-api.d.ts.map +1 -1
  169. package/dist/server/src/controllers/index.d.ts +1 -0
  170. package/dist/server/src/controllers/index.d.ts.map +1 -1
  171. package/dist/server/src/index.d.ts +6 -0
  172. package/dist/server/src/index.d.ts.map +1 -1
  173. package/dist/server/src/routes/content-api.d.ts.map +1 -1
  174. package/dist/server/src/routes/validation/upload.d.ts +45 -0
  175. package/dist/server/src/routes/validation/upload.d.ts.map +1 -1
  176. package/dist/server/src/services/index.d.ts +5 -0
  177. package/dist/server/src/services/index.d.ts.map +1 -1
  178. package/dist/server/src/services/provider.d.ts +2 -1
  179. package/dist/server/src/services/provider.d.ts.map +1 -1
  180. package/dist/server/src/services/upload.d.ts +5 -0
  181. package/dist/server/src/services/upload.d.ts.map +1 -1
  182. package/dist/server/src/utils/mime-validation.d.ts.map +1 -1
  183. package/dist/server/utils/mime-validation.js +8 -2
  184. package/dist/server/utils/mime-validation.js.map +1 -1
  185. package/dist/server/utils/mime-validation.mjs +9 -3
  186. package/dist/server/utils/mime-validation.mjs.map +1 -1
  187. package/package.json +7 -7
@@ -1 +1 @@
1
- {"version":3,"file":"useFolderNavigation.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderNavigation.ts"],"sourcesContent":["import { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nexport const useFolderNavigation = () => {\n const [{ query }, setQuery] = useQueryParams<{ folder?: string }>();\n\n const currentFolderId = query?.folder ? Number(query.folder) : null;\n\n const navigateToFolder = (folder: Folder) => {\n setQuery({ folder: String(folder.id) });\n };\n\n return {\n currentFolderId,\n navigateToFolder,\n };\n};\n"],"names":["useFolderNavigation","query","setQuery","useQueryParams","currentFolderId","folder","Number","navigateToFolder","String","id"],"mappings":";;;;MAIaA,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;AAE9B,IAAA,MAAMC,kBAAkBH,KAAAA,EAAOI,MAAAA,GAASC,MAAAA,CAAOL,KAAAA,CAAMI,MAAM,CAAA,GAAI,IAAA;AAE/D,IAAA,MAAME,mBAAmB,CAACF,MAAAA,GAAAA;QACxBH,QAAAA,CAAS;YAAEG,MAAAA,EAAQG,MAAAA,CAAOH,OAAOI,EAAE;AAAE,SAAA,CAAA;AACvC,IAAA,CAAA;IAEA,OAAO;AACLL,QAAAA,eAAAA;AACAG,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useFolderNavigation.js","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderNavigation.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nconst parseFolderIdFromQuery = (folder: string | undefined): number | null => {\n if (!folder) {\n return null;\n }\n\n const id = Number(folder);\n\n return Number.isFinite(id) ? id : null;\n};\n\nexport const useFolderNavigation = () => {\n const [{ query }, setQuery] = useQueryParams<{ folder?: string }>();\n\n const currentFolderId = parseFolderIdFromQuery(query?.folder);\n\n const navigateToFolder = (folder: Folder) => {\n setQuery({ folder: String(folder.id) });\n };\n\n /**\n * Move to the Media Library root by removing the `folder` query param.\n * `setQuery(_, 'remove')` deletes the keys present on the first argument\n * (value is ignored), so any other query state (filters, pagination, etc.)\n * is preserved.\n */\n const navigateToRoot = useCallback(() => {\n setQuery({ folder: '' }, 'remove');\n }, [setQuery]);\n\n // Malformed ?folder= values (e.g. abc) parse as null; strip the param from the URL.\n // Deleted/missing folders (404) are handled in AssetsPage — that needs a fetch.\n useEffect(() => {\n if (query?.folder && currentFolderId === null) {\n navigateToRoot();\n }\n }, [query?.folder, currentFolderId, navigateToRoot]);\n\n /**\n * Convenience for the FolderTree sidebar: a single entry point that handles\n * both \"go home\" and \"go to folder X\" without forcing the caller to know\n * whether to call navigateToFolder or navigateToRoot.\n */\n const navigateToFolderId = (folderId: number | null) => {\n if (folderId == null) {\n navigateToRoot();\n } else {\n setQuery({ folder: String(folderId) });\n }\n };\n\n return {\n currentFolderId,\n navigateToFolder,\n navigateToRoot,\n navigateToFolderId,\n };\n};\n"],"names":["parseFolderIdFromQuery","folder","id","Number","isFinite","useFolderNavigation","query","setQuery","useQueryParams","currentFolderId","navigateToFolder","String","navigateToRoot","useCallback","useEffect","navigateToFolderId","folderId"],"mappings":";;;;;AAMA,MAAMA,yBAAyB,CAACC,MAAAA,GAAAA;AAC9B,IAAA,IAAI,CAACA,MAAAA,EAAQ;QACX,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,KAAKC,MAAAA,CAAOF,MAAAA,CAAAA;AAElB,IAAA,OAAOE,MAAAA,CAAOC,QAAQ,CAACF,EAAAA,CAAAA,GAAMA,EAAAA,GAAK,IAAA;AACpC,CAAA;MAEaG,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,0BAAAA,EAAAA;IAE9B,MAAMC,eAAAA,GAAkBT,uBAAuBM,KAAAA,EAAOL,MAAAA,CAAAA;AAEtD,IAAA,MAAMS,mBAAmB,CAACT,MAAAA,GAAAA;QACxBM,QAAAA,CAAS;YAAEN,MAAAA,EAAQU,MAAAA,CAAOV,OAAOC,EAAE;AAAE,SAAA,CAAA;AACvC,IAAA,CAAA;AAEA;;;;;MAMA,MAAMU,iBAAiBC,iBAAAA,CAAY,IAAA;QACjCN,QAAAA,CAAS;YAAEN,MAAAA,EAAQ;SAAG,EAAG,QAAA,CAAA;IAC3B,CAAA,EAAG;AAACM,QAAAA;AAAS,KAAA,CAAA;;;IAIbO,eAAAA,CAAU,IAAA;QACR,IAAIR,KAAAA,EAAOL,MAAAA,IAAUQ,eAAAA,KAAoB,IAAA,EAAM;AAC7CG,YAAAA,cAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;QAACN,KAAAA,EAAOL,MAAAA;AAAQQ,QAAAA,eAAAA;AAAiBG,QAAAA;AAAe,KAAA,CAAA;AAEnD;;;;MAKA,MAAMG,qBAAqB,CAACC,QAAAA,GAAAA;AAC1B,QAAA,IAAIA,YAAY,IAAA,EAAM;AACpBJ,YAAAA,cAAAA,EAAAA;QACF,CAAA,MAAO;YACLL,QAAAA,CAAS;AAAEN,gBAAAA,MAAAA,EAAQU,MAAAA,CAAOK,QAAAA;AAAU,aAAA,CAAA;AACtC,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLP,QAAAA,eAAAA;AACAC,QAAAA,gBAAAA;AACAE,QAAAA,cAAAA;AACAG,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -1,16 +1,62 @@
1
+ import { useCallback, useEffect } from 'react';
1
2
  import { useQueryParams } from '@strapi/admin/strapi-admin';
2
3
 
4
+ const parseFolderIdFromQuery = (folder)=>{
5
+ if (!folder) {
6
+ return null;
7
+ }
8
+ const id = Number(folder);
9
+ return Number.isFinite(id) ? id : null;
10
+ };
3
11
  const useFolderNavigation = ()=>{
4
12
  const [{ query }, setQuery] = useQueryParams();
5
- const currentFolderId = query?.folder ? Number(query.folder) : null;
13
+ const currentFolderId = parseFolderIdFromQuery(query?.folder);
6
14
  const navigateToFolder = (folder)=>{
7
15
  setQuery({
8
16
  folder: String(folder.id)
9
17
  });
10
18
  };
19
+ /**
20
+ * Move to the Media Library root by removing the `folder` query param.
21
+ * `setQuery(_, 'remove')` deletes the keys present on the first argument
22
+ * (value is ignored), so any other query state (filters, pagination, etc.)
23
+ * is preserved.
24
+ */ const navigateToRoot = useCallback(()=>{
25
+ setQuery({
26
+ folder: ''
27
+ }, 'remove');
28
+ }, [
29
+ setQuery
30
+ ]);
31
+ // Malformed ?folder= values (e.g. abc) parse as null; strip the param from the URL.
32
+ // Deleted/missing folders (404) are handled in AssetsPage — that needs a fetch.
33
+ useEffect(()=>{
34
+ if (query?.folder && currentFolderId === null) {
35
+ navigateToRoot();
36
+ }
37
+ }, [
38
+ query?.folder,
39
+ currentFolderId,
40
+ navigateToRoot
41
+ ]);
42
+ /**
43
+ * Convenience for the FolderTree sidebar: a single entry point that handles
44
+ * both "go home" and "go to folder X" without forcing the caller to know
45
+ * whether to call navigateToFolder or navigateToRoot.
46
+ */ const navigateToFolderId = (folderId)=>{
47
+ if (folderId == null) {
48
+ navigateToRoot();
49
+ } else {
50
+ setQuery({
51
+ folder: String(folderId)
52
+ });
53
+ }
54
+ };
11
55
  return {
12
56
  currentFolderId,
13
- navigateToFolder
57
+ navigateToFolder,
58
+ navigateToRoot,
59
+ navigateToFolderId
14
60
  };
15
61
  };
16
62
 
@@ -1 +1 @@
1
- {"version":3,"file":"useFolderNavigation.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderNavigation.ts"],"sourcesContent":["import { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nexport const useFolderNavigation = () => {\n const [{ query }, setQuery] = useQueryParams<{ folder?: string }>();\n\n const currentFolderId = query?.folder ? Number(query.folder) : null;\n\n const navigateToFolder = (folder: Folder) => {\n setQuery({ folder: String(folder.id) });\n };\n\n return {\n currentFolderId,\n navigateToFolder,\n };\n};\n"],"names":["useFolderNavigation","query","setQuery","useQueryParams","currentFolderId","folder","Number","navigateToFolder","String","id"],"mappings":";;MAIaA,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;AAE9B,IAAA,MAAMC,kBAAkBH,KAAAA,EAAOI,MAAAA,GAASC,MAAAA,CAAOL,KAAAA,CAAMI,MAAM,CAAA,GAAI,IAAA;AAE/D,IAAA,MAAME,mBAAmB,CAACF,MAAAA,GAAAA;QACxBH,QAAAA,CAAS;YAAEG,MAAAA,EAAQG,MAAAA,CAAOH,OAAOI,EAAE;AAAE,SAAA,CAAA;AACvC,IAAA,CAAA;IAEA,OAAO;AACLL,QAAAA,eAAAA;AACAG,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useFolderNavigation.mjs","sources":["../../../../../../admin/src/future/pages/Assets/hooks/useFolderNavigation.ts"],"sourcesContent":["import { useCallback, useEffect } from 'react';\n\nimport { useQueryParams } from '@strapi/admin/strapi-admin';\n\nimport type { Folder } from '../../../../../../shared/contracts/folders';\n\nconst parseFolderIdFromQuery = (folder: string | undefined): number | null => {\n if (!folder) {\n return null;\n }\n\n const id = Number(folder);\n\n return Number.isFinite(id) ? id : null;\n};\n\nexport const useFolderNavigation = () => {\n const [{ query }, setQuery] = useQueryParams<{ folder?: string }>();\n\n const currentFolderId = parseFolderIdFromQuery(query?.folder);\n\n const navigateToFolder = (folder: Folder) => {\n setQuery({ folder: String(folder.id) });\n };\n\n /**\n * Move to the Media Library root by removing the `folder` query param.\n * `setQuery(_, 'remove')` deletes the keys present on the first argument\n * (value is ignored), so any other query state (filters, pagination, etc.)\n * is preserved.\n */\n const navigateToRoot = useCallback(() => {\n setQuery({ folder: '' }, 'remove');\n }, [setQuery]);\n\n // Malformed ?folder= values (e.g. abc) parse as null; strip the param from the URL.\n // Deleted/missing folders (404) are handled in AssetsPage — that needs a fetch.\n useEffect(() => {\n if (query?.folder && currentFolderId === null) {\n navigateToRoot();\n }\n }, [query?.folder, currentFolderId, navigateToRoot]);\n\n /**\n * Convenience for the FolderTree sidebar: a single entry point that handles\n * both \"go home\" and \"go to folder X\" without forcing the caller to know\n * whether to call navigateToFolder or navigateToRoot.\n */\n const navigateToFolderId = (folderId: number | null) => {\n if (folderId == null) {\n navigateToRoot();\n } else {\n setQuery({ folder: String(folderId) });\n }\n };\n\n return {\n currentFolderId,\n navigateToFolder,\n navigateToRoot,\n navigateToFolderId,\n };\n};\n"],"names":["parseFolderIdFromQuery","folder","id","Number","isFinite","useFolderNavigation","query","setQuery","useQueryParams","currentFolderId","navigateToFolder","String","navigateToRoot","useCallback","useEffect","navigateToFolderId","folderId"],"mappings":";;;AAMA,MAAMA,yBAAyB,CAACC,MAAAA,GAAAA;AAC9B,IAAA,IAAI,CAACA,MAAAA,EAAQ;QACX,OAAO,IAAA;AACT,IAAA;AAEA,IAAA,MAAMC,KAAKC,MAAAA,CAAOF,MAAAA,CAAAA;AAElB,IAAA,OAAOE,MAAAA,CAAOC,QAAQ,CAACF,EAAAA,CAAAA,GAAMA,EAAAA,GAAK,IAAA;AACpC,CAAA;MAEaG,mBAAAA,GAAsB,IAAA;AACjC,IAAA,MAAM,CAAC,EAAEC,KAAK,EAAE,EAAEC,SAAS,GAAGC,cAAAA,EAAAA;IAE9B,MAAMC,eAAAA,GAAkBT,uBAAuBM,KAAAA,EAAOL,MAAAA,CAAAA;AAEtD,IAAA,MAAMS,mBAAmB,CAACT,MAAAA,GAAAA;QACxBM,QAAAA,CAAS;YAAEN,MAAAA,EAAQU,MAAAA,CAAOV,OAAOC,EAAE;AAAE,SAAA,CAAA;AACvC,IAAA,CAAA;AAEA;;;;;MAMA,MAAMU,iBAAiBC,WAAAA,CAAY,IAAA;QACjCN,QAAAA,CAAS;YAAEN,MAAAA,EAAQ;SAAG,EAAG,QAAA,CAAA;IAC3B,CAAA,EAAG;AAACM,QAAAA;AAAS,KAAA,CAAA;;;IAIbO,SAAAA,CAAU,IAAA;QACR,IAAIR,KAAAA,EAAOL,MAAAA,IAAUQ,eAAAA,KAAoB,IAAA,EAAM;AAC7CG,YAAAA,cAAAA,EAAAA;AACF,QAAA;IACF,CAAA,EAAG;QAACN,KAAAA,EAAOL,MAAAA;AAAQQ,QAAAA,eAAAA;AAAiBG,QAAAA;AAAe,KAAA,CAAA;AAEnD;;;;MAKA,MAAMG,qBAAqB,CAACC,QAAAA,GAAAA;AAC1B,QAAA,IAAIA,YAAY,IAAA,EAAM;AACpBJ,YAAAA,cAAAA,EAAAA;QACF,CAAA,MAAO;YACLL,QAAAA,CAAS;AAAEN,gBAAAA,MAAAA,EAAQU,MAAAA,CAAOK,QAAAA;AAAU,aAAA,CAAA;AACtC,QAAA;AACF,IAAA,CAAA;IAEA,OAAO;AACLP,QAAAA,eAAAA;AACAC,QAAAA,gBAAAA;AACAE,QAAAA,cAAAA;AACAG,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -73,6 +73,32 @@ const foldersApi = api.uploadApi.injectEndpoints({
73
73
  {
74
74
  type: 'Folder',
75
75
  id: 'LIST'
76
+ },
77
+ {
78
+ type: 'Folder',
79
+ id: 'STRUCTURE'
80
+ }
81
+ ]
82
+ }),
83
+ /**
84
+ * Hierarchical folder tree used by the FolderTree sidebar. Returned as a
85
+ * single nested array — the server walks the folders table once and
86
+ * assembles parent/child relationships.
87
+ *
88
+ * TODO: filter results like `admin-folder.find` for folder-scoped roles
89
+ * (v1 returns all folders; relies on global `plugin::upload.read`).
90
+ */ getFolderStructure: builder.query({
91
+ query: ()=>({
92
+ url: '/upload/folder-structure',
93
+ method: 'GET'
94
+ }),
95
+ // TODO: align GetFolderStructure contract with the real /upload/folder-structure
96
+ // envelope and drop this defensive unwrap (data[] vs { data: [] }).
97
+ transformResponse: (response)=>response?.data ?? response ?? [],
98
+ providesTags: [
99
+ {
100
+ type: 'Folder',
101
+ id: 'STRUCTURE'
76
102
  }
77
103
  ]
78
104
  }),
@@ -139,10 +165,11 @@ const foldersApi = api.uploadApi.injectEndpoints({
139
165
  })
140
166
  })
141
167
  });
142
- const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery, useGetAllFoldersQuery } = foldersApi;
168
+ const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery, useGetAllFoldersQuery, useGetFolderStructureQuery } = foldersApi;
143
169
 
144
170
  exports.useCreateFolderMutation = useCreateFolderMutation;
145
171
  exports.useGetAllFoldersQuery = useGetAllFoldersQuery;
146
172
  exports.useGetFolderQuery = useGetFolderQuery;
173
+ exports.useGetFolderStructureQuery = useGetFolderStructureQuery;
147
174
  exports.useGetFoldersQuery = useGetFoldersQuery;
148
175
  //# sourceMappingURL=folders.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"folders.js","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n CreateFolders,\n GetFolder,\n GetFolders,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [{ type: 'Folder', id: 'LIST' }],\n }),\n /**\n * Flat list of every folder, used to populate the \"Location\" select in the\n * asset details drawer. No parent filter — we want the entire tree in one\n * query so the select can render any destination folder.\n */\n getAllFolders: builder.query<Folder[], void>({\n query: () => ({\n url: '/upload/folders',\n method: 'GET',\n }),\n transformResponse: (response: GetFolders.Response['data']) =>\n ((response as any)?.data ?? response ?? []) as Folder[],\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder' as const, id: 'LIST' },\n ];\n }\n return [{ type: 'Folder' as const, id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const {\n useCreateFolderMutation,\n useGetFoldersQuery,\n useGetFolderQuery,\n useGetAllFoldersQuery,\n} = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getAllFolders","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery","useGetAllFoldersQuery"],"mappings":"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"}
1
+ {"version":3,"file":"folders.js","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n FolderNode,\n CreateFolders,\n GetFolder,\n GetFolders,\n GetFolderStructure,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [\n { type: 'Folder', id: 'LIST' },\n { type: 'Folder', id: 'STRUCTURE' },\n ],\n }),\n /**\n * Hierarchical folder tree used by the FolderTree sidebar. Returned as a\n * single nested array — the server walks the folders table once and\n * assembles parent/child relationships.\n *\n * TODO: filter results like `admin-folder.find` for folder-scoped roles\n * (v1 returns all folders; relies on global `plugin::upload.read`).\n */\n getFolderStructure: builder.query<FolderNode[], void>({\n query: () => ({\n url: '/upload/folder-structure',\n method: 'GET',\n }),\n // TODO: align GetFolderStructure contract with the real /upload/folder-structure\n // envelope and drop this defensive unwrap (data[] vs { data: [] }).\n transformResponse: (response: GetFolderStructure.Response['data']) =>\n ((response as unknown as { data: FolderNode[] })?.data ??\n (response as unknown as FolderNode[]) ??\n []) as FolderNode[],\n providesTags: [{ type: 'Folder', id: 'STRUCTURE' }],\n }),\n /**\n * Flat list of every folder, used to populate the \"Location\" select in the\n * asset details drawer. No parent filter — we want the entire tree in one\n * query so the select can render any destination folder.\n */\n getAllFolders: builder.query<Folder[], void>({\n query: () => ({\n url: '/upload/folders',\n method: 'GET',\n }),\n transformResponse: (response: GetFolders.Response['data']) =>\n ((response as any)?.data ?? response ?? []) as Folder[],\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder' as const, id: 'LIST' },\n ];\n }\n return [{ type: 'Folder' as const, id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const {\n useCreateFolderMutation,\n useGetFoldersQuery,\n useGetFolderQuery,\n useGetAllFoldersQuery,\n useGetFolderStructureQuery,\n} = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getFolderStructure","getAllFolders","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery","useGetAllFoldersQuery","useGetFolderStructureQuery"],"mappings":"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"}
@@ -71,6 +71,32 @@ const foldersApi = uploadApi.injectEndpoints({
71
71
  {
72
72
  type: 'Folder',
73
73
  id: 'LIST'
74
+ },
75
+ {
76
+ type: 'Folder',
77
+ id: 'STRUCTURE'
78
+ }
79
+ ]
80
+ }),
81
+ /**
82
+ * Hierarchical folder tree used by the FolderTree sidebar. Returned as a
83
+ * single nested array — the server walks the folders table once and
84
+ * assembles parent/child relationships.
85
+ *
86
+ * TODO: filter results like `admin-folder.find` for folder-scoped roles
87
+ * (v1 returns all folders; relies on global `plugin::upload.read`).
88
+ */ getFolderStructure: builder.query({
89
+ query: ()=>({
90
+ url: '/upload/folder-structure',
91
+ method: 'GET'
92
+ }),
93
+ // TODO: align GetFolderStructure contract with the real /upload/folder-structure
94
+ // envelope and drop this defensive unwrap (data[] vs { data: [] }).
95
+ transformResponse: (response)=>response?.data ?? response ?? [],
96
+ providesTags: [
97
+ {
98
+ type: 'Folder',
99
+ id: 'STRUCTURE'
74
100
  }
75
101
  ]
76
102
  }),
@@ -137,7 +163,7 @@ const foldersApi = uploadApi.injectEndpoints({
137
163
  })
138
164
  })
139
165
  });
140
- const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery, useGetAllFoldersQuery } = foldersApi;
166
+ const { useCreateFolderMutation, useGetFoldersQuery, useGetFolderQuery, useGetAllFoldersQuery, useGetFolderStructureQuery } = foldersApi;
141
167
 
142
- export { useCreateFolderMutation, useGetAllFoldersQuery, useGetFolderQuery, useGetFoldersQuery };
168
+ export { useCreateFolderMutation, useGetAllFoldersQuery, useGetFolderQuery, useGetFolderStructureQuery, useGetFoldersQuery };
143
169
  //# sourceMappingURL=folders.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n CreateFolders,\n GetFolder,\n GetFolders,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [{ type: 'Folder', id: 'LIST' }],\n }),\n /**\n * Flat list of every folder, used to populate the \"Location\" select in the\n * asset details drawer. No parent filter — we want the entire tree in one\n * query so the select can render any destination folder.\n */\n getAllFolders: builder.query<Folder[], void>({\n query: () => ({\n url: '/upload/folders',\n method: 'GET',\n }),\n transformResponse: (response: GetFolders.Response['data']) =>\n ((response as any)?.data ?? response ?? []) as Folder[],\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder' as const, id: 'LIST' },\n ];\n }\n return [{ type: 'Folder' as const, id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const {\n useCreateFolderMutation,\n useGetFoldersQuery,\n useGetFolderQuery,\n useGetAllFoldersQuery,\n} = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getAllFolders","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery","useGetAllFoldersQuery"],"mappings":"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"}
1
+ {"version":3,"file":"folders.mjs","sources":["../../../../admin/src/future/services/folders.ts"],"sourcesContent":["import { uploadApi } from './api';\n\nimport type {\n Folder,\n FolderNode,\n CreateFolders,\n GetFolder,\n GetFolders,\n GetFolderStructure,\n} from '../../../../shared/contracts/folders';\n\nexport type FolderWithCounts = Omit<Folder, 'children' | 'files'> & {\n children?: { count: number };\n files?: { count: number };\n};\n\ninterface GetFoldersParams {\n parentId?: number | null;\n}\n\nconst foldersApi = uploadApi.injectEndpoints({\n endpoints: (builder) => ({\n getFolders: builder.query<Folder[], GetFoldersParams | void>({\n query: (params = {}) => {\n const { parentId } = params as GetFoldersParams;\n\n const queryParams: Record<string, unknown> = {};\n\n if (parentId != null) {\n queryParams['filters'] = {\n $and: [{ parent: { id: parentId } }],\n };\n } else {\n queryParams['filters'] = {\n $and: [{ parent: { id: { $null: true } } }],\n };\n }\n\n return {\n url: '/upload/folders',\n method: 'GET',\n config: { params: queryParams },\n };\n },\n transformResponse: (response: GetFolders.Response['data']) =>\n // TODO dont want this cast\n (response as any).data,\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder', id: 'LIST' },\n ];\n }\n return [{ type: 'Folder', id: 'LIST' }];\n },\n }),\n createFolder: builder.mutation<CreateFolders.Response['data'], CreateFolders.Request['body']>({\n query: (body) => ({\n url: '/upload/folders',\n method: 'POST',\n data: body,\n }),\n transformResponse: (response: CreateFolders.Response) => response.data,\n invalidatesTags: [\n { type: 'Folder', id: 'LIST' },\n { type: 'Folder', id: 'STRUCTURE' },\n ],\n }),\n /**\n * Hierarchical folder tree used by the FolderTree sidebar. Returned as a\n * single nested array — the server walks the folders table once and\n * assembles parent/child relationships.\n *\n * TODO: filter results like `admin-folder.find` for folder-scoped roles\n * (v1 returns all folders; relies on global `plugin::upload.read`).\n */\n getFolderStructure: builder.query<FolderNode[], void>({\n query: () => ({\n url: '/upload/folder-structure',\n method: 'GET',\n }),\n // TODO: align GetFolderStructure contract with the real /upload/folder-structure\n // envelope and drop this defensive unwrap (data[] vs { data: [] }).\n transformResponse: (response: GetFolderStructure.Response['data']) =>\n ((response as unknown as { data: FolderNode[] })?.data ??\n (response as unknown as FolderNode[]) ??\n []) as FolderNode[],\n providesTags: [{ type: 'Folder', id: 'STRUCTURE' }],\n }),\n /**\n * Flat list of every folder, used to populate the \"Location\" select in the\n * asset details drawer. No parent filter — we want the entire tree in one\n * query so the select can render any destination folder.\n */\n getAllFolders: builder.query<Folder[], void>({\n query: () => ({\n url: '/upload/folders',\n method: 'GET',\n }),\n transformResponse: (response: GetFolders.Response['data']) =>\n ((response as any)?.data ?? response ?? []) as Folder[],\n providesTags: (results) => {\n if (results) {\n return [\n ...results.map(({ id }) => ({ type: 'Folder' as const, id })),\n { type: 'Folder' as const, id: 'LIST' },\n ];\n }\n return [{ type: 'Folder' as const, id: 'LIST' }];\n },\n }),\n getFolder: builder.query<FolderWithCounts, { id: number }>({\n query: ({ id }) => ({\n url: `/upload/folders/${id}`,\n method: 'GET',\n config: {\n params: {\n populate: {\n parent: {\n populate: {\n parent: '*',\n },\n },\n children: { count: true },\n files: { count: true },\n },\n },\n },\n }),\n transformResponse: (response: GetFolder.Response) =>\n response.data as unknown as FolderWithCounts,\n providesTags: (_result, _error, { id }) => [{ type: 'Folder', id }],\n }),\n }),\n});\n\nexport const {\n useCreateFolderMutation,\n useGetFoldersQuery,\n useGetFolderQuery,\n useGetAllFoldersQuery,\n useGetFolderStructureQuery,\n} = foldersApi;\n"],"names":["foldersApi","uploadApi","injectEndpoints","endpoints","builder","getFolders","query","params","parentId","queryParams","$and","parent","id","$null","url","method","config","transformResponse","response","data","providesTags","results","map","type","createFolder","mutation","body","invalidatesTags","getFolderStructure","getAllFolders","getFolder","populate","children","count","files","_result","_error","useCreateFolderMutation","useGetFoldersQuery","useGetFolderQuery","useGetAllFoldersQuery","useGetFolderStructureQuery"],"mappings":"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"}
@@ -2,6 +2,10 @@
2
2
 
3
3
  var byteSize = require('byte-size');
4
4
 
5
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
+
7
+ var byteSize__default = /*#__PURE__*/_interopDefault(byteSize);
8
+
5
9
  const MAX_URLS = 20;
6
10
  /**
7
11
  * Formats a byte value into a human-readable string with units.
@@ -17,7 +21,7 @@ const MAX_URLS = 20;
17
21
  * ```
18
22
  */ function formatBytes(receivedBytes, decimals = 0) {
19
23
  const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;
20
- const { value, unit } = byteSize(realBytes * 1000, {
24
+ const { value, unit } = byteSize__default.default(realBytes * 1000, {
21
25
  precision: decimals
22
26
  });
23
27
  if (!unit) {
@@ -1 +1 @@
1
- {"version":3,"file":"files.js","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nconst MAX_URLS = 20;\n\n/**\n * Formats a byte value into a human-readable string with units.\n *\n * @param receivedBytes - The number of bytes to format (as number or string)\n * @param decimals - The number of decimal places to display (default: 0)\n * @returns A formatted string with value and unit (e.g., \"1.5MB\")\n *\n * @example\n * ```ts\n * formatBytes(1024) // '1KB'\n * formatBytes(1536, 1) // '1.5KB'\n * ```\n */\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\n/**\n * Extracts the file extension from a string, removing the leading dot if present.\n *\n * @param ext - The file extension string (may include leading dot)\n * @returns The extension without leading dot, or the original value if no dot\n *\n * @example\n * ```ts\n * getFileExtension('.jpg') // 'jpg'\n * getFileExtension('png') // 'png'\n * ```\n */\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\n/**\n * Prefixes a relative file URL with the backend URL if needed.\n *\n * @param fileURL - The file URL to potentially prefix\n * @returns The full URL with backend prefix if it was relative, otherwise unchanged\n *\n * @example\n * ```ts\n * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'\n * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'\n * ```\n */\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n\n/**\n * Extracts a filename from a URL's pathname.\n *\n * @param url - The URL to extract the filename from\n * @returns The filename extracted from the URL path, or 'file' if none found\n *\n * @example\n * ```ts\n * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'\n * getFilenameFromUrl('https://example.com/') // 'file'\n * ```\n */\nexport function getFilenameFromUrl(url: string): string {\n const pathname = new URL(url).pathname;\n const filename = pathname.split('/').pop();\n return filename || 'file';\n}\n\n/**\n * Validates a newline-separated string of URLs.\n *\n * @param urlsString - A string containing URLs separated by newlines\n * @returns An object with validated URLs array and optional error message\n *\n * @example\n * ```ts\n * const { urls, error } = validateUrls('https://example.com/a.jpg\\nhttps://example.com/b.jpg');\n * if (error) {\n * console.error(error);\n * } else {\n * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']\n * }\n * ```\n */\nexport function validateUrls(urlsString: string): { urls: string[]; error: string | null } {\n const urls = urlsString\n .split(/\\r?\\n/)\n .map((url) => url.trim())\n .filter(Boolean);\n\n if (urls.length === 0) {\n return { urls: [], error: 'Please provide at least one URL' };\n }\n\n if (urls.length > MAX_URLS) {\n return { urls: [], error: `Maximum ${MAX_URLS} URLs allowed` };\n }\n\n const invalidUrls: string[] = [];\n for (const url of urls) {\n try {\n new URL(url);\n } catch {\n invalidUrls.push(url);\n }\n }\n\n if (invalidUrls.length > 0) {\n const message =\n invalidUrls.length === 1\n ? `Invalid URL: ${invalidUrls[0]}`\n : `${invalidUrls.length} invalid URLs found`;\n return { urls: [], error: message };\n }\n\n return { urls, error: null };\n}\n"],"names":["MAX_URLS","formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL","getFilenameFromUrl","url","pathname","URL","filename","split","pop","validateUrls","urlsString","urls","map","trim","filter","Boolean","length","error","invalidUrls","push","message"],"mappings":"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"}
1
+ {"version":3,"file":"files.js","sources":["../../../../admin/src/future/utils/files.ts"],"sourcesContent":["import byteSize from 'byte-size';\n\nconst MAX_URLS = 20;\n\n/**\n * Formats a byte value into a human-readable string with units.\n *\n * @param receivedBytes - The number of bytes to format (as number or string)\n * @param decimals - The number of decimal places to display (default: 0)\n * @returns A formatted string with value and unit (e.g., \"1.5MB\")\n *\n * @example\n * ```ts\n * formatBytes(1024) // '1KB'\n * formatBytes(1536, 1) // '1.5KB'\n * ```\n */\nexport function formatBytes(receivedBytes: number | string, decimals = 0) {\n const realBytes = typeof receivedBytes === 'string' ? Number(receivedBytes) : receivedBytes;\n const { value, unit } = byteSize(realBytes * 1000, { precision: decimals });\n\n if (!unit) {\n return '0B';\n }\n\n return `${value}${unit.toUpperCase()}`;\n}\n\n/**\n * Extracts the file extension from a string, removing the leading dot if present.\n *\n * @param ext - The file extension string (may include leading dot)\n * @returns The extension without leading dot, or the original value if no dot\n *\n * @example\n * ```ts\n * getFileExtension('.jpg') // 'jpg'\n * getFileExtension('png') // 'png'\n * ```\n */\nexport const getFileExtension = (ext?: string | null) =>\n ext && ext[0] === '.' ? ext.substring(1) : ext;\n\n/**\n * Prefixes a relative file URL with the backend URL if needed.\n *\n * @param fileURL - The file URL to potentially prefix\n * @returns The full URL with backend prefix if it was relative, otherwise unchanged\n *\n * @example\n * ```ts\n * prefixFileUrlWithBackendUrl('/uploads/image.jpg') // 'http://localhost:1337/uploads/image.jpg'\n * prefixFileUrlWithBackendUrl('https://cdn.example.com/image.jpg') // 'https://cdn.example.com/image.jpg'\n * ```\n */\nexport const prefixFileUrlWithBackendUrl = (fileURL?: string) => {\n return !!fileURL && fileURL.startsWith('/') ? `${window.strapi.backendURL}${fileURL}` : fileURL;\n};\n\n/**\n * Extracts a filename from a URL's pathname.\n *\n * @param url - The URL to extract the filename from\n * @returns The filename extracted from the URL path, or 'file' if none found\n *\n * @example\n * ```ts\n * getFilenameFromUrl('https://example.com/images/photo.jpg') // 'photo.jpg'\n * getFilenameFromUrl('https://example.com/') // 'file'\n * ```\n */\nexport function getFilenameFromUrl(url: string): string {\n const pathname = new URL(url).pathname;\n const filename = pathname.split('/').pop();\n return filename || 'file';\n}\n\n/**\n * Validates a newline-separated string of URLs.\n *\n * @param urlsString - A string containing URLs separated by newlines\n * @returns An object with validated URLs array and optional error message\n *\n * @example\n * ```ts\n * const { urls, error } = validateUrls('https://example.com/a.jpg\\nhttps://example.com/b.jpg');\n * if (error) {\n * console.error(error);\n * } else {\n * console.log(urls); // ['https://example.com/a.jpg', 'https://example.com/b.jpg']\n * }\n * ```\n */\nexport function validateUrls(urlsString: string): { urls: string[]; error: string | null } {\n const urls = urlsString\n .split(/\\r?\\n/)\n .map((url) => url.trim())\n .filter(Boolean);\n\n if (urls.length === 0) {\n return { urls: [], error: 'Please provide at least one URL' };\n }\n\n if (urls.length > MAX_URLS) {\n return { urls: [], error: `Maximum ${MAX_URLS} URLs allowed` };\n }\n\n const invalidUrls: string[] = [];\n for (const url of urls) {\n try {\n new URL(url);\n } catch {\n invalidUrls.push(url);\n }\n }\n\n if (invalidUrls.length > 0) {\n const message =\n invalidUrls.length === 1\n ? `Invalid URL: ${invalidUrls[0]}`\n : `${invalidUrls.length} invalid URLs found`;\n return { urls: [], error: message };\n }\n\n return { urls, error: null };\n}\n"],"names":["MAX_URLS","formatBytes","receivedBytes","decimals","realBytes","Number","value","unit","byteSize","precision","toUpperCase","getFileExtension","ext","substring","prefixFileUrlWithBackendUrl","fileURL","startsWith","window","strapi","backendURL","getFilenameFromUrl","url","pathname","URL","filename","split","pop","validateUrls","urlsString","urls","map","trim","filter","Boolean","length","error","invalidUrls","push","message"],"mappings":"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"}
@@ -11,7 +11,8 @@ require('qs');
11
11
  require('../utils/typeFromMime.js');
12
12
  require('../utils/urlYupSchema.js');
13
13
 
14
- function _interopNamespaceDefault(e) {
14
+ function _interopNamespace(e) {
15
+ if (e && e.__esModule) return e;
15
16
  var n = Object.create(null);
16
17
  if (e) {
17
18
  Object.keys(e).forEach(function (k) {
@@ -28,7 +29,7 @@ function _interopNamespaceDefault(e) {
28
29
  return Object.freeze(n);
29
30
  }
30
31
 
31
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
32
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
32
33
 
33
34
  const fetchLatestJob = async (get)=>{
34
35
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"useAIMetadataJob.js","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAAA,CAAI,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,0BAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,yBAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAAA,IAAW,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAAA,EAAMe,GAAG,EAAEC,OAAO,EAAE,GAAGC,mBAAAA,CAC7B;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GAAAA,CAAAA,EACrB;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAA,EAAc;gBAChC,OAAO,IAAA;AACT,YAAA;;YAGA,OAAO,KAAA;AACT,QAAA,CAAA;QACAC,KAAAA,EAAO,KAAA;QACPC,oBAAAA,EAAsB;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAAA,IAAU,IAAA;;AAGxCN,IAAAA,gBAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAAA,EAAkB;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,WAAA,EAAa;YAC1ElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,wCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD,QAAA;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,QAAA,EAAU;YACvElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,qCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAAA,EAAkB;YAC1CV,oBAAAA,CAAqBU,gBAAAA,CAAAA;AACvB,QAAA;IACF,CAAA,EAAG;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAAA,EAAMe,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useAIMetadataJob.js","sources":["../../../admin/src/hooks/useAIMetadataJob.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useQuery, useQueryClient } from 'react-query';\n\nimport { AIMetadataJob } from '../../../shared/contracts/ai-metadata-jobs';\nimport { getTrad } from '../utils';\n\nconst fetchLatestJob = async (\n get: ReturnType<typeof useFetchClient>['get']\n): Promise<AIMetadataJob | null> => {\n try {\n const { data } = await get('/upload/actions/generate-ai-metadata/latest');\n return data;\n } catch {\n // Return null on any error - UI treats this as \"no active job\"\n return null;\n }\n};\n\nexport const useAIMetadataJob = (options?: { enabled?: boolean }) => {\n const { get } = useFetchClient();\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const queryClient = useQueryClient();\n const enabled = options?.enabled ?? true;\n\n const [previousJobStatus, setPreviousJobStatus] = React.useState<AIMetadataJob['status'] | null>(\n null\n );\n\n // Single query with conditional polling\n const { data: job, refetch } = useQuery<AIMetadataJob | null, { message: string }>(\n ['ai-metadata-latest-job'],\n () => fetchLatestJob(get),\n {\n enabled,\n // Poll every second when job is processing\n refetchInterval: (data) => {\n // If no data yet, don't poll\n if (!data) return false;\n\n // Poll while processing\n if (data.status === 'processing') {\n return 1000;\n }\n\n // Stop polling when completed or failed\n return false;\n },\n retry: false,\n refetchOnWindowFocus: false,\n }\n );\n\n const currentJobStatus = job?.status ?? null;\n\n // Detect status transitions and show notifications\n React.useEffect(() => {\n if (!currentJobStatus) return;\n\n // Detect transition from active state to completed\n if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-completed'),\n defaultMessage: 'Successfully generated metadata',\n }),\n });\n // Invalidate metadata count query to refresh the count\n queryClient.invalidateQueries(['ai-metadata-count']);\n }\n\n // Detect transition from active state to failed\n if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: getTrad('settings.form.aiMetadata.job-failed'),\n defaultMessage: 'Failed to generate metadata. Please try again.',\n }),\n });\n }\n\n // Update previous status if it changed\n if (previousJobStatus !== currentJobStatus) {\n setPreviousJobStatus(currentJobStatus);\n }\n }, [currentJobStatus, previousJobStatus, toggleNotification, formatMessage, queryClient]);\n\n return {\n data: job,\n refetch,\n };\n};\n"],"names":["fetchLatestJob","get","data","useAIMetadataJob","options","useFetchClient","toggleNotification","useNotification","formatMessage","useIntl","queryClient","useQueryClient","enabled","previousJobStatus","setPreviousJobStatus","React","useState","job","refetch","useQuery","refetchInterval","status","retry","refetchOnWindowFocus","currentJobStatus","useEffect","type","message","id","getTrad","defaultMessage","invalidateQueries"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,iBAAiB,OACrBC,GAAAA,GAAAA;IAEA,IAAI;AACF,QAAA,MAAM,EAAEC,IAAI,EAAE,GAAG,MAAMD,GAAAA,CAAI,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,IAAA,CAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT,IAAA;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,0BAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAAA,GAAcC,yBAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAAA,IAAW,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAAA,EAAmBC,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAAA,EAAMe,GAAG,EAAEC,OAAO,EAAE,GAAGC,mBAAAA,CAC7B;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GAAAA,CAAAA,EACrB;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAA,EAAc;gBAChC,OAAO,IAAA;AACT,YAAA;;YAGA,OAAO,KAAA;AACT,QAAA,CAAA;QACAC,KAAAA,EAAO,KAAA;QACPC,oBAAAA,EAAsB;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAAA,IAAU,IAAA;;AAGxCN,IAAAA,gBAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAAA,EAAkB;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,WAAA,EAAa;YAC1ElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,wCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD,QAAA;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAA,IAAgBW,gBAAAA,KAAqB,QAAA,EAAU;YACvElB,kBAAAA,CAAmB;gBACjBoB,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAAA,CAAc;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAAA,CAAQ,qCAAA,CAAA;oBACZC,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAAA,EAAkB;YAC1CV,oBAAAA,CAAqBU,gBAAAA,CAAAA;AACvB,QAAA;IACF,CAAA,EAAG;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAAA,EAAMe,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -7,7 +7,8 @@ var reactIntl = require('react-intl');
7
7
  var reactQuery = require('react-query');
8
8
  var pluginId = require('../pluginId.js');
9
9
 
10
- function _interopNamespaceDefault(e) {
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule) return e;
11
12
  var n = Object.create(null);
12
13
  if (e) {
13
14
  Object.keys(e).forEach(function (k) {
@@ -24,7 +25,7 @@ function _interopNamespaceDefault(e) {
24
25
  return Object.freeze(n);
25
26
  }
26
27
 
27
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
28
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
28
29
 
29
30
  const useAssets = ({ skipWhen = false, query = {} } = {})=>{
30
31
  const { formatMessage } = reactIntl.useIntl();
@@ -1 +1 @@
1
- {"version":3,"file":"useAssets.js","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folder, folderPath: _folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folder: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folder","folderPath","_folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","id","$null","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","defaultMessage","type","message"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeO,MAAMA,SAAAA,GAAY,CAAC,EAAEC,QAAAA,GAAW,KAAK,EAAEC,KAAAA,GAAQ,EAAE,EAAoB,GAAG,EAAE,GAAA;IAC/E,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,YAAY,EAAE,GAAGC,wBAAAA,EAAAA;IACzB,MAAM,EAAEC,GAAG,EAAE,GAAGC,0BAAAA,EAAAA;IAChB,MAAM,EAAEC,MAAM,EAAEC,UAAAA,EAAYC,WAAW,EAAEC,EAAE,EAAE,GAAGC,sBAAAA,EAAwB,GAAGb,KAAAA;IAE3E,IAAIc,MAAAA;AAEJ,IAAA,IAAIF,EAAAA,EAAI;QACNE,MAAAA,GAAS;AACP,YAAA,GAAGD,sBAAsB;AACzBD,YAAAA,EAAAA,EAAIG,kBAAAA,CAAmBH,EAAAA;AACzB,SAAA;IACF,CAAA,MAAO;QACLE,MAAAA,GAAS;AACP,YAAA,GAAGD,sBAAsB;YACzBG,OAAAA,EAAS;gBACPC,IAAAA,EAAM;uBACAJ,sBAAAA,EAAwBG,OAAAA,EAASC,QAAQ,EAAE;AAC/C,oBAAA;wBACER,MAAAA,EAAQ;AACNS,4BAAAA,EAAAA,EAAIT,MAAAA,IAAU;gCACZU,KAAAA,EAAO;AACT;AACF;AACF;AACD;AACH;AACF,SAAA;AACF,IAAA;IAEA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGC,mBAAAA,CAIjC;AAACC,QAAAA,iBAAAA;AAAU,QAAA,QAAA;AAAUV,QAAAA;KAAO,EAC5B,UAAA;AACE,QAAA,MAAM,EAAEM,IAAI,EAAE,GAAG,MAAMb,IAAI,eAAA,EAAiB;AAAEO,YAAAA;AAAO,SAAA,CAAA;QAErD,OAAOM,IAAAA;IACT,CAAA,EACA;AACEK,QAAAA,OAAAA,EAAS,CAAC1B,QAAAA;QACV2B,SAAAA,EAAW,CAAA;QACXC,SAAAA,EAAW,CAAA;AACXC,QAAAA,MAAAA,CAAAA,CAAOR,IAAI,EAAA;AACT,YAAA,IAAIA,MAAMS,OAAAA,IAAWC,KAAAA,CAAMC,OAAO,CAACX,IAAAA,CAAKS,OAAO,CAAA,EAAG;gBAChD,OAAO;AACL,oBAAA,GAAGT,IAAI;oBACPS,OAAAA,EAAST,IAAAA,CAAKS,OAAO;;;;mBAMlBG,MAAM,CAAC,CAACC,KAAAA,GAAUA,KAAAA,CAAMC,IAAI,CAAA,CAC5BC,GAAG,CAAC,CAACF,KAAAA,IAAW;AACf,4BAAA,GAAGA,KAAK;AACR;;;oBAIAG,IAAAA,EAAMH,KAAAA,CAAMG,IAAI,IAAI,EAAA;4BACpBC,GAAAA,EAAKJ,KAAAA,CAAMI,GAAG,IAAI;yBACpB,CAAA;AACJ,iBAAA;AACF,YAAA;YAEA,OAAOjB,IAAAA;AACT,QAAA;AACF,KAAA,CAAA;AAGFkB,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;AACd,QAAA,IAAInB,IAAAA,EAAM;AACRf,YAAAA,YAAAA,CACEJ,aAAAA,CAAc;gBACZiB,EAAAA,EAAI,wBAAA;gBACJsB,cAAAA,EAAgB;AAClB,aAAA,CAAA,CAAA;AAEJ,QAAA;IACF,CAAA,EAAG;AAACpB,QAAAA,IAAAA;AAAMnB,QAAAA,aAAAA;AAAeI,QAAAA;AAAa,KAAA,CAAA;AAEtCiC,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;AACd,QAAA,IAAIlB,KAAAA,EAAO;YACTlB,kBAAAA,CAAmB;gBACjBsC,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAASzC,aAAAA,CAAc;oBAAEiB,EAAAA,EAAI;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACG,QAAAA,KAAAA;AAAOpB,QAAAA,aAAAA;AAAeE,QAAAA;AAAmB,KAAA,CAAA;IAE7C,OAAO;AAAEiB,QAAAA,IAAAA;AAAMC,QAAAA,KAAAA;AAAOC,QAAAA;AAAU,KAAA;AAClC;;;;"}
1
+ {"version":3,"file":"useAssets.js","sources":["../../../admin/src/hooks/useAssets.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { Query, GetFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\ninterface UseAssetsOptions {\n skipWhen?: boolean;\n query?: Query;\n}\n\nexport const useAssets = ({ skipWhen = false, query = {} }: UseAssetsOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { get } = useFetchClient();\n const { folder, folderPath: _folderPath, _q, ...paramsExceptFolderAndQ } = query;\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n _q: encodeURIComponent(_q),\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n folder: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFiles.Response['data'],\n GetFiles.Response['error']\n >(\n [pluginId, 'assets', params],\n async () => {\n const { data } = await get('/upload/files', { params });\n\n return data;\n },\n {\n enabled: !skipWhen,\n staleTime: 0,\n cacheTime: 0,\n select(data) {\n if (data?.results && Array.isArray(data.results)) {\n return {\n ...data,\n results: data.results\n /**\n * Filter out assets that don't have a name.\n * So we don't try to render them as assets\n * and get errors.\n */\n .filter((asset) => asset.name)\n .map((asset) => ({\n ...asset,\n /**\n * Mime and ext cannot be null in the front-end because\n * we expect them to be strings and use the `includes` method.\n */\n mime: asset.mime ?? '',\n ext: asset.ext ?? '',\n })),\n };\n }\n\n return data;\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The assets have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n }\n }, [error, formatMessage, toggleNotification]);\n\n return { data, error, isLoading };\n};\n"],"names":["useAssets","skipWhen","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","get","useFetchClient","folder","folderPath","_folderPath","_q","paramsExceptFolderAndQ","params","encodeURIComponent","filters","$and","id","$null","data","error","isLoading","useQuery","pluginId","enabled","staleTime","cacheTime","select","results","Array","isArray","filter","asset","name","map","mime","ext","React","useEffect","defaultMessage","type","message"],"mappings":"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"}
@@ -3,7 +3,10 @@
3
3
  var React = require('react');
4
4
  var Cropper = require('cropperjs');
5
5
 
6
- function _interopNamespaceDefault(e) {
6
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
7
+
8
+ function _interopNamespace(e) {
9
+ if (e && e.__esModule) return e;
7
10
  var n = Object.create(null);
8
11
  if (e) {
9
12
  Object.keys(e).forEach(function (k) {
@@ -20,7 +23,8 @@ function _interopNamespaceDefault(e) {
20
23
  return Object.freeze(n);
21
24
  }
22
25
 
23
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
26
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
27
+ var Cropper__default = /*#__PURE__*/_interopDefault(Cropper);
24
28
 
25
29
  const QUALITY = 1;
26
30
  const useCropImg = ()=>{
@@ -47,7 +51,7 @@ const useCropImg = ()=>{
47
51
  };
48
52
  const crop = (image)=>{
49
53
  if (!cropperRef.current) {
50
- cropperRef.current = new Cropper(image, {
54
+ cropperRef.current = new Cropper__default.default(image, {
51
55
  modal: true,
52
56
  initialAspectRatio: 16 / 9,
53
57
  movable: true,
@@ -1 +1 @@
1
- {"version":3,"file":"useCropImg.js","sources":["../../../admin/src/hooks/useCropImg.ts"],"sourcesContent":["import * as React from 'react';\n\nimport Cropper from 'cropperjs';\n\nconst QUALITY = 1;\n\ntype Size = {\n width?: number;\n height?: number;\n};\n\ntype Resize = {\n detail: {\n height: number;\n width: number;\n };\n};\n\nexport const useCropImg = () => {\n const cropperRef = React.useRef<Cropper>();\n const [isCropping, setIsCropping] = React.useState(false);\n const [size, setSize] = React.useState<Size>({ width: undefined, height: undefined });\n\n React.useEffect(() => {\n return () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n }\n };\n }, []);\n\n const handleResize = ({ detail: { height, width } }: Resize) => {\n const roundedDataWidth = Math.round(width);\n const roundedDataHeight = Math.round(height);\n\n setSize({ width: roundedDataWidth, height: roundedDataHeight });\n };\n\n const crop = (image: HTMLImageElement) => {\n if (!cropperRef.current) {\n cropperRef.current = new Cropper(image, {\n modal: true,\n initialAspectRatio: 16 / 9,\n movable: true,\n zoomable: false,\n cropBoxResizable: true,\n background: false,\n checkCrossOrigin: false,\n crop: handleResize,\n });\n\n setIsCropping(true);\n }\n };\n\n const stopCropping = () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n cropperRef.current = undefined;\n setIsCropping(false);\n }\n };\n\n const produceFile = (name: string, mimeType: string, lastModifiedDate: string) =>\n new Promise((resolve, reject) => {\n if (!cropperRef.current) {\n reject(\n new Error(\n 'The cropper has not been instantiated: make sure to call the crop() function before calling produceFile().'\n )\n );\n } else {\n const canvas = cropperRef.current.getCroppedCanvas();\n\n canvas.toBlob(\n (blob) => {\n resolve(\n new File([blob!], name, {\n type: mimeType,\n lastModified: new Date(lastModifiedDate).getTime(),\n })\n );\n },\n mimeType,\n QUALITY\n );\n }\n });\n\n return {\n crop,\n produceFile,\n stopCropping,\n isCropping,\n isCropperReady: Boolean(cropperRef.current),\n ...size,\n };\n};\n"],"names":["QUALITY","useCropImg","cropperRef","React","useRef","isCropping","setIsCropping","useState","size","setSize","width","undefined","height","useEffect","current","destroy","handleResize","detail","roundedDataWidth","Math","round","roundedDataHeight","crop","image","Cropper","modal","initialAspectRatio","movable","zoomable","cropBoxResizable","background","checkCrossOrigin","stopCropping","produceFile","name","mimeType","lastModifiedDate","Promise","resolve","reject","Error","canvas","getCroppedCanvas","toBlob","blob","File","type","lastModified","Date","getTime","isCropperReady","Boolean"],"mappings":"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"}
1
+ {"version":3,"file":"useCropImg.js","sources":["../../../admin/src/hooks/useCropImg.ts"],"sourcesContent":["import * as React from 'react';\n\nimport Cropper from 'cropperjs';\n\nconst QUALITY = 1;\n\ntype Size = {\n width?: number;\n height?: number;\n};\n\ntype Resize = {\n detail: {\n height: number;\n width: number;\n };\n};\n\nexport const useCropImg = () => {\n const cropperRef = React.useRef<Cropper>();\n const [isCropping, setIsCropping] = React.useState(false);\n const [size, setSize] = React.useState<Size>({ width: undefined, height: undefined });\n\n React.useEffect(() => {\n return () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n }\n };\n }, []);\n\n const handleResize = ({ detail: { height, width } }: Resize) => {\n const roundedDataWidth = Math.round(width);\n const roundedDataHeight = Math.round(height);\n\n setSize({ width: roundedDataWidth, height: roundedDataHeight });\n };\n\n const crop = (image: HTMLImageElement) => {\n if (!cropperRef.current) {\n cropperRef.current = new Cropper(image, {\n modal: true,\n initialAspectRatio: 16 / 9,\n movable: true,\n zoomable: false,\n cropBoxResizable: true,\n background: false,\n checkCrossOrigin: false,\n crop: handleResize,\n });\n\n setIsCropping(true);\n }\n };\n\n const stopCropping = () => {\n if (cropperRef.current) {\n cropperRef.current.destroy();\n cropperRef.current = undefined;\n setIsCropping(false);\n }\n };\n\n const produceFile = (name: string, mimeType: string, lastModifiedDate: string) =>\n new Promise((resolve, reject) => {\n if (!cropperRef.current) {\n reject(\n new Error(\n 'The cropper has not been instantiated: make sure to call the crop() function before calling produceFile().'\n )\n );\n } else {\n const canvas = cropperRef.current.getCroppedCanvas();\n\n canvas.toBlob(\n (blob) => {\n resolve(\n new File([blob!], name, {\n type: mimeType,\n lastModified: new Date(lastModifiedDate).getTime(),\n })\n );\n },\n mimeType,\n QUALITY\n );\n }\n });\n\n return {\n crop,\n produceFile,\n stopCropping,\n isCropping,\n isCropperReady: Boolean(cropperRef.current),\n ...size,\n };\n};\n"],"names":["QUALITY","useCropImg","cropperRef","React","useRef","isCropping","setIsCropping","useState","size","setSize","width","undefined","height","useEffect","current","destroy","handleResize","detail","roundedDataWidth","Math","round","roundedDataHeight","crop","image","Cropper","modal","initialAspectRatio","movable","zoomable","cropBoxResizable","background","checkCrossOrigin","stopCropping","produceFile","name","mimeType","lastModifiedDate","Promise","resolve","reject","Error","canvas","getCroppedCanvas","toBlob","blob","File","type","lastModified","Date","getTime","isCropperReady","Boolean"],"mappings":"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"}
@@ -12,7 +12,8 @@ require('qs');
12
12
  require('../utils/typeFromMime.js');
13
13
  require('../utils/urlYupSchema.js');
14
14
 
15
- function _interopNamespaceDefault(e) {
15
+ function _interopNamespace(e) {
16
+ if (e && e.__esModule) return e;
16
17
  var n = Object.create(null);
17
18
  if (e) {
18
19
  Object.keys(e).forEach(function (k) {
@@ -29,7 +30,7 @@ function _interopNamespaceDefault(e) {
29
30
  return Object.freeze(n);
30
31
  }
31
32
 
32
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
33
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
33
34
 
34
35
  const editAssetRequest = (asset, file, signal, onProgress, post)=>{
35
36
  const endpoint = `/${pluginId.pluginId}?id=${asset.id}`;
@@ -1 +1 @@
1
- {"version":3,"file":"useEditAsset.js","sources":["../../../admin/src/hooks/useEditAsset.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport type ErrorMutation = {\n message: string;\n response: {\n status: number;\n data: {\n error: Error;\n };\n };\n} | null;\n\nconst editAssetRequest = (\n asset: FileAsset,\n file: File,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const endpoint = `/${pluginId}?id=${asset.id}`;\n\n const formData = new FormData();\n\n if (file) {\n formData.append('files', file);\n }\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n alternativeText: asset.alternativeText,\n caption: asset.caption,\n focalPoint: asset.focalPoint,\n folder: asset.folder,\n name: asset.name,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useEditAsset = () => {\n const [progress, setProgress] = React.useState(0);\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFile.Response['data'],\n ErrorMutation,\n { asset: FileAsset; file: File }\n >(({ asset, file }) => editAssetRequest(asset, file, signal, setProgress, post), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n },\n onError(reason) {\n if (reason?.response?.status === 403) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('permissions.not-allowed.update') }),\n });\n } else {\n toggleNotification({ type: 'danger', message: reason?.message });\n }\n },\n });\n\n const editAsset = (asset: FileAsset, file: File) => mutation.mutateAsync({ asset, file });\n\n const cancel = () => abortController.abort();\n\n return { ...mutation, cancel, editAsset, progress, status: mutation.status };\n};\n"],"names":["editAssetRequest","asset","file","signal","onProgress","post","endpoint","pluginId","id","formData","FormData","append","JSON","stringify","alternativeText","caption","focalPoint","folder","name","then","res","data","useEditAsset","progress","setProgress","React","useState","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","abortController","AbortController","useFetchClient","mutation","useMutation","onSuccess","refetchQueries","active","onError","reason","response","status","type","message","getTrad","editAsset","mutateAsync","cancel","abort"],"mappings":"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"}
1
+ {"version":3,"file":"useEditAsset.js","sources":["../../../admin/src/hooks/useEditAsset.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient, FetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { UpdateFile, File as FileAsset } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\nexport type ErrorMutation = {\n message: string;\n response: {\n status: number;\n data: {\n error: Error;\n };\n };\n} | null;\n\nconst editAssetRequest = (\n asset: FileAsset,\n file: File,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const endpoint = `/${pluginId}?id=${asset.id}`;\n\n const formData = new FormData();\n\n if (file) {\n formData.append('files', file);\n }\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n alternativeText: asset.alternativeText,\n caption: asset.caption,\n focalPoint: asset.focalPoint,\n folder: asset.folder,\n name: asset.name,\n })\n );\n\n /**\n * onProgress is not possible using native fetch\n * need to look into an alternative to make it work\n * perhaps using xhr like Axios does\n */\n return post(endpoint, formData, {\n signal,\n }).then((res) => res.data);\n};\n\nexport const useEditAsset = () => {\n const [progress, setProgress] = React.useState(0);\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n UpdateFile.Response['data'],\n ErrorMutation,\n { asset: FileAsset; file: File }\n >(({ asset, file }) => editAssetRequest(asset, file, signal, setProgress, post), {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n },\n onError(reason) {\n if (reason?.response?.status === 403) {\n toggleNotification({\n type: 'info',\n message: formatMessage({ id: getTrad('permissions.not-allowed.update') }),\n });\n } else {\n toggleNotification({ type: 'danger', message: reason?.message });\n }\n },\n });\n\n const editAsset = (asset: FileAsset, file: File) => mutation.mutateAsync({ asset, file });\n\n const cancel = () => abortController.abort();\n\n return { ...mutation, cancel, editAsset, progress, status: mutation.status };\n};\n"],"names":["editAssetRequest","asset","file","signal","onProgress","post","endpoint","pluginId","id","formData","FormData","append","JSON","stringify","alternativeText","caption","focalPoint","folder","name","then","res","data","useEditAsset","progress","setProgress","React","useState","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","abortController","AbortController","useFetchClient","mutation","useMutation","onSuccess","refetchQueries","active","onError","reason","response","status","type","message","getTrad","editAsset","mutateAsync","cancel","abort"],"mappings":"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"}
@@ -8,7 +8,8 @@ var reactIntl = require('react-intl');
8
8
  var reactQuery = require('react-query');
9
9
  var pluginId = require('../pluginId.js');
10
10
 
11
- function _interopNamespaceDefault(e) {
11
+ function _interopNamespace(e) {
12
+ if (e && e.__esModule) return e;
12
13
  var n = Object.create(null);
13
14
  if (e) {
14
15
  Object.keys(e).forEach(function (k) {
@@ -25,7 +26,7 @@ function _interopNamespaceDefault(e) {
25
26
  return Object.freeze(n);
26
27
  }
27
28
 
28
- var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
29
+ var React__namespace = /*#__PURE__*/_interopNamespace(React);
29
30
 
30
31
  const useFolders = ({ enabled = true, query = {} } = {})=>{
31
32
  const { formatMessage } = reactIntl.useIntl();
@@ -1 +1 @@
1
- {"version":3,"file":"useFolders.js","sources":["../../../admin/src/hooks/useFolders.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\n\nimport type { Query } from '../../../shared/contracts/files';\n\ninterface UseFoldersOptions {\n enabled?: boolean;\n query?: Query;\n}\n\nexport const useFolders = ({ enabled = true, query = {} }: UseFoldersOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { folder, _q, ...paramsExceptFolderAndQ } = query;\n const { get } = useFetchClient();\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n _q,\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n parent: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFolders.Response['data'],\n GetFolders.Response['error']\n >(\n [pluginId, 'folders', stringify(params)],\n async () => {\n const {\n data: { data },\n } = await get<GetFolders.Response>('/upload/folders', { params });\n\n return data;\n },\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The folders have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return { data, error, isLoading };\n};\n"],"names":["useFolders","enabled","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","folder","_q","paramsExceptFolderAndQ","get","useFetchClient","params","pagination","pageSize","filters","$and","parent","id","$null","data","error","isLoading","useQuery","pluginId","stringify","staleTime","cacheTime","onError","type","message","React","useEffect","defaultMessage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAMA,UAAAA,GAAa,CAAC,EAAEC,OAAAA,GAAU,IAAI,EAAEC,KAAAA,GAAQ,EAAE,EAAqB,GAAG,EAAE,GAAA;IAC/E,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,YAAY,EAAE,GAAGC,wBAAAA,EAAAA;AACzB,IAAA,MAAM,EAAEC,MAAM,EAAEC,EAAE,EAAE,GAAGC,wBAAwB,GAAGT,KAAAA;IAClD,MAAM,EAAEU,GAAG,EAAE,GAAGC,0BAAAA,EAAAA;IAEhB,IAAIC,MAAAA;AAEJ,IAAA,IAAIJ,EAAAA,EAAI;QACNI,MAAAA,GAAS;AACP,YAAA,GAAGH,sBAAsB;YACzBI,UAAAA,EAAY;AACVC,gBAAAA,QAAAA,EAAU;AACZ,aAAA;AACAN,YAAAA;AACF,SAAA;IACF,CAAA,MAAO;QACLI,MAAAA,GAAS;AACP,YAAA,GAAGH,sBAAsB;YACzBI,UAAAA,EAAY;AACVC,gBAAAA,QAAAA,EAAU;AACZ,aAAA;YACAC,OAAAA,EAAS;gBACPC,IAAAA,EAAM;uBACAP,sBAAAA,EAAwBM,OAAAA,EAASC,QAAQ,EAAE;AAC/C,oBAAA;wBACEC,MAAAA,EAAQ;AACNC,4BAAAA,EAAAA,EAAIX,MAAAA,IAAU;gCACZY,KAAAA,EAAO;AACT;AACF;AACF;AACD;AACH;AACF,SAAA;AACF,IAAA;IAEA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGC,mBAAAA,CAIjC;AAACC,QAAAA,iBAAAA;AAAU,QAAA,SAAA;QAAWC,YAAAA,CAAUb,MAAAA;KAAQ,EACxC,UAAA;QACE,MAAM,EACJQ,MAAM,EAAEA,IAAI,EAAE,EACf,GAAG,MAAMV,GAAAA,CAAyB,iBAAA,EAAmB;AAAEE,YAAAA;AAAO,SAAA,CAAA;QAE/D,OAAOQ,IAAAA;IACT,CAAA,EACA;AACErB,QAAAA,OAAAA;QACA2B,SAAAA,EAAW,CAAA;QACXC,SAAAA,EAAW,CAAA;AACXC,QAAAA,OAAAA,CAAAA,GAAAA;YACEzB,kBAAAA,CAAmB;gBACjB0B,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAS7B,aAAAA,CAAc;oBAAEiB,EAAAA,EAAI;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AAGFa,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;AACd,QAAA,IAAIZ,IAAAA,EAAM;AACRf,YAAAA,YAAAA,CACEJ,aAAAA,CAAc;gBACZiB,EAAAA,EAAI,wBAAA;gBACJe,cAAAA,EAAgB;AAClB,aAAA,CAAA,CAAA;AAEJ,QAAA;IACF,CAAA,EAAG;AAACb,QAAAA,IAAAA;AAAMnB,QAAAA,aAAAA;AAAeI,QAAAA;AAAa,KAAA,CAAA;IAEtC,OAAO;AAAEe,QAAAA,IAAAA;AAAMC,QAAAA,KAAAA;AAAOC,QAAAA;AAAU,KAAA;AAClC;;;;"}
1
+ {"version":3,"file":"useFolders.js","sources":["../../../admin/src/hooks/useFolders.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useNotifyAT } from '@strapi/design-system';\nimport { stringify } from 'qs';\nimport { useIntl } from 'react-intl';\nimport { useQuery } from 'react-query';\n\nimport { GetFolders } from '../../../shared/contracts/folders';\nimport { pluginId } from '../pluginId';\n\nimport type { Query } from '../../../shared/contracts/files';\n\ninterface UseFoldersOptions {\n enabled?: boolean;\n query?: Query;\n}\n\nexport const useFolders = ({ enabled = true, query = {} }: UseFoldersOptions = {}) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { notifyStatus } = useNotifyAT();\n const { folder, _q, ...paramsExceptFolderAndQ } = query;\n const { get } = useFetchClient();\n\n let params: Query;\n\n if (_q) {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n _q,\n };\n } else {\n params = {\n ...paramsExceptFolderAndQ,\n pagination: {\n pageSize: -1,\n },\n filters: {\n $and: [\n ...(paramsExceptFolderAndQ?.filters?.$and ?? []),\n {\n parent: {\n id: folder ?? {\n $null: true,\n },\n },\n },\n ],\n },\n };\n }\n\n const { data, error, isLoading } = useQuery<\n GetFolders.Response['data'],\n GetFolders.Response['error']\n >(\n [pluginId, 'folders', stringify(params)],\n async () => {\n const {\n data: { data },\n } = await get<GetFolders.Response>('/upload/folders', { params });\n\n return data;\n },\n {\n enabled,\n staleTime: 0,\n cacheTime: 0,\n onError() {\n toggleNotification({\n type: 'danger',\n message: formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n React.useEffect(() => {\n if (data) {\n notifyStatus(\n formatMessage({\n id: 'list.asset.at.finished',\n defaultMessage: 'The folders have finished loading.',\n })\n );\n }\n }, [data, formatMessage, notifyStatus]);\n\n return { data, error, isLoading };\n};\n"],"names":["useFolders","enabled","query","formatMessage","useIntl","toggleNotification","useNotification","notifyStatus","useNotifyAT","folder","_q","paramsExceptFolderAndQ","get","useFetchClient","params","pagination","pageSize","filters","$and","parent","id","$null","data","error","isLoading","useQuery","pluginId","stringify","staleTime","cacheTime","onError","type","message","React","useEffect","defaultMessage"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBO,MAAMA,UAAAA,GAAa,CAAC,EAAEC,OAAAA,GAAU,IAAI,EAAEC,KAAAA,GAAQ,EAAE,EAAqB,GAAG,EAAE,GAAA;IAC/E,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;IAC/B,MAAM,EAAEC,YAAY,EAAE,GAAGC,wBAAAA,EAAAA;AACzB,IAAA,MAAM,EAAEC,MAAM,EAAEC,EAAE,EAAE,GAAGC,wBAAwB,GAAGT,KAAAA;IAClD,MAAM,EAAEU,GAAG,EAAE,GAAGC,0BAAAA,EAAAA;IAEhB,IAAIC,MAAAA;AAEJ,IAAA,IAAIJ,EAAAA,EAAI;QACNI,MAAAA,GAAS;AACP,YAAA,GAAGH,sBAAsB;YACzBI,UAAAA,EAAY;AACVC,gBAAAA,QAAAA,EAAU;AACZ,aAAA;AACAN,YAAAA;AACF,SAAA;IACF,CAAA,MAAO;QACLI,MAAAA,GAAS;AACP,YAAA,GAAGH,sBAAsB;YACzBI,UAAAA,EAAY;AACVC,gBAAAA,QAAAA,EAAU;AACZ,aAAA;YACAC,OAAAA,EAAS;gBACPC,IAAAA,EAAM;uBACAP,sBAAAA,EAAwBM,OAAAA,EAASC,QAAQ,EAAE;AAC/C,oBAAA;wBACEC,MAAAA,EAAQ;AACNC,4BAAAA,EAAAA,EAAIX,MAAAA,IAAU;gCACZY,KAAAA,EAAO;AACT;AACF;AACF;AACD;AACH;AACF,SAAA;AACF,IAAA;IAEA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAEC,SAAS,EAAE,GAAGC,mBAAAA,CAIjC;AAACC,QAAAA,iBAAAA;AAAU,QAAA,SAAA;QAAWC,YAAAA,CAAUb,MAAAA;KAAQ,EACxC,UAAA;QACE,MAAM,EACJQ,MAAM,EAAEA,IAAI,EAAE,EACf,GAAG,MAAMV,GAAAA,CAAyB,iBAAA,EAAmB;AAAEE,YAAAA;AAAO,SAAA,CAAA;QAE/D,OAAOQ,IAAAA;IACT,CAAA,EACA;AACErB,QAAAA,OAAAA;QACA2B,SAAAA,EAAW,CAAA;QACXC,SAAAA,EAAW,CAAA;AACXC,QAAAA,OAAAA,CAAAA,GAAAA;YACEzB,kBAAAA,CAAmB;gBACjB0B,IAAAA,EAAM,QAAA;AACNC,gBAAAA,OAAAA,EAAS7B,aAAAA,CAAc;oBAAEiB,EAAAA,EAAI;AAAqB,iBAAA;AACpD,aAAA,CAAA;AACF,QAAA;AACF,KAAA,CAAA;AAGFa,IAAAA,gBAAAA,CAAMC,SAAS,CAAC,IAAA;AACd,QAAA,IAAIZ,IAAAA,EAAM;AACRf,YAAAA,YAAAA,CACEJ,aAAAA,CAAc;gBACZiB,EAAAA,EAAI,wBAAA;gBACJe,cAAAA,EAAgB;AAClB,aAAA,CAAA,CAAA;AAEJ,QAAA;IACF,CAAA,EAAG;AAACb,QAAAA,IAAAA;AAAMnB,QAAAA,aAAAA;AAAeI,QAAAA;AAAa,KAAA,CAAA;IAEtC,OAAO;AAAEe,QAAAA,IAAAA;AAAMC,QAAAA,KAAAA;AAAOC,QAAAA;AAAU,KAAA;AAClC;;;;"}