@strapi/upload 5.33.4 → 5.35.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 (183) hide show
  1. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +32 -3
  2. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  3. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +32 -3
  4. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  5. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
  6. package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
  7. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +57 -0
  8. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -0
  9. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +55 -0
  10. package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -0
  11. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +96 -20
  12. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
  13. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +98 -22
  14. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
  15. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js +47 -0
  16. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
  17. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs +44 -1
  18. package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
  19. package/dist/admin/future/App.js +45 -0
  20. package/dist/admin/future/App.js.map +1 -0
  21. package/dist/admin/future/App.mjs +43 -0
  22. package/dist/admin/future/App.mjs.map +1 -0
  23. package/dist/admin/future/pages/AIGenerationPage.js +24 -0
  24. package/dist/admin/future/pages/AIGenerationPage.js.map +1 -0
  25. package/dist/admin/future/pages/AIGenerationPage.mjs +22 -0
  26. package/dist/admin/future/pages/AIGenerationPage.mjs.map +1 -0
  27. package/dist/admin/future/pages/MediaLibraryPage.js +119 -0
  28. package/dist/admin/future/pages/MediaLibraryPage.js.map +1 -0
  29. package/dist/admin/future/pages/MediaLibraryPage.mjs +98 -0
  30. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +1 -0
  31. package/dist/admin/future/services/api.js +28 -0
  32. package/dist/admin/future/services/api.js.map +1 -0
  33. package/dist/admin/future/services/api.mjs +25 -0
  34. package/dist/admin/future/services/api.mjs.map +1 -0
  35. package/dist/admin/future/utils/translations.js +8 -0
  36. package/dist/admin/future/utils/translations.js.map +1 -0
  37. package/dist/admin/future/utils/translations.mjs +6 -0
  38. package/dist/admin/future/utils/translations.mjs.map +1 -0
  39. package/dist/admin/hooks/useAIMetadataJob.js +114 -0
  40. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -0
  41. package/dist/admin/hooks/useAIMetadataJob.mjs +93 -0
  42. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -0
  43. package/dist/admin/hooks/useEditAsset.js +1 -0
  44. package/dist/admin/hooks/useEditAsset.js.map +1 -1
  45. package/dist/admin/hooks/useEditAsset.mjs +1 -0
  46. package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
  47. package/dist/admin/index.js +23 -4
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/admin/index.mjs +24 -5
  50. package/dist/admin/index.mjs.map +1 -1
  51. package/dist/admin/package.json.js +6 -5
  52. package/dist/admin/package.json.js.map +1 -1
  53. package/dist/admin/package.json.mjs +6 -5
  54. package/dist/admin/package.json.mjs.map +1 -1
  55. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -0
  56. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  57. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -0
  58. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  59. package/dist/admin/pages/App/components/Header.js +3 -0
  60. package/dist/admin/pages/App/components/Header.js.map +1 -1
  61. package/dist/admin/pages/App/components/Header.mjs +3 -0
  62. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  63. package/dist/admin/pages/SettingsPage/SettingsPage.js +252 -67
  64. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  65. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +256 -71
  66. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  67. package/dist/admin/src/components/EditAssetDialog/PreviewBox/AssetPreview.d.ts +1 -2
  68. package/dist/admin/src/components/EditAssetDialog/PreviewBox/FocalPointActions.d.ts +7 -0
  69. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.d.ts +6 -2
  70. package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +13 -0
  71. package/dist/admin/src/future/App.d.ts +1 -0
  72. package/dist/admin/src/future/pages/AIGenerationPage.d.ts +1 -0
  73. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +1 -0
  74. package/dist/admin/src/future/services/api.d.ts +6 -0
  75. package/dist/admin/src/future/services/settings.d.ts +2 -0
  76. package/dist/admin/src/future/utils/translations.d.ts +1 -0
  77. package/dist/admin/src/hooks/useAIMetadataJob.d.ts +9 -0
  78. package/dist/admin/translations/de.json.js +44 -1
  79. package/dist/admin/translations/de.json.js.map +1 -1
  80. package/dist/admin/translations/de.json.mjs +44 -1
  81. package/dist/admin/translations/de.json.mjs.map +1 -1
  82. package/dist/admin/translations/en.json.js +17 -0
  83. package/dist/admin/translations/en.json.js.map +1 -1
  84. package/dist/admin/translations/en.json.mjs +17 -0
  85. package/dist/admin/translations/en.json.mjs.map +1 -1
  86. package/dist/server/bootstrap.js +1 -0
  87. package/dist/server/bootstrap.js.map +1 -1
  88. package/dist/server/bootstrap.mjs +1 -0
  89. package/dist/server/bootstrap.mjs.map +1 -1
  90. package/dist/server/content-types/file.js +4 -0
  91. package/dist/server/content-types/file.js.map +1 -1
  92. package/dist/server/content-types/file.mjs +4 -0
  93. package/dist/server/content-types/file.mjs.map +1 -1
  94. package/dist/server/controllers/admin-file.js +86 -0
  95. package/dist/server/controllers/admin-file.js.map +1 -1
  96. package/dist/server/controllers/admin-file.mjs +86 -0
  97. package/dist/server/controllers/admin-file.mjs.map +1 -1
  98. package/dist/server/controllers/admin-upload.js +3 -23
  99. package/dist/server/controllers/admin-upload.js.map +1 -1
  100. package/dist/server/controllers/admin-upload.mjs +3 -23
  101. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  102. package/dist/server/controllers/validation/admin/upload.js +5 -0
  103. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  104. package/dist/server/controllers/validation/admin/upload.mjs +5 -0
  105. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  106. package/dist/server/controllers/validation/content-api/upload.js +6 -1
  107. package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
  108. package/dist/server/controllers/validation/content-api/upload.mjs +6 -1
  109. package/dist/server/controllers/validation/content-api/upload.mjs.map +1 -1
  110. package/dist/server/models/ai-metadata-job.js +36 -0
  111. package/dist/server/models/ai-metadata-job.js.map +1 -0
  112. package/dist/server/models/ai-metadata-job.mjs +33 -0
  113. package/dist/server/models/ai-metadata-job.mjs.map +1 -0
  114. package/dist/server/register.js +3 -0
  115. package/dist/server/register.js.map +1 -1
  116. package/dist/server/register.mjs +3 -0
  117. package/dist/server/register.mjs.map +1 -1
  118. package/dist/server/routes/admin.js +46 -0
  119. package/dist/server/routes/admin.js.map +1 -1
  120. package/dist/server/routes/admin.mjs +46 -0
  121. package/dist/server/routes/admin.mjs.map +1 -1
  122. package/dist/server/services/ai-metadata-jobs.js +72 -0
  123. package/dist/server/services/ai-metadata-jobs.js.map +1 -0
  124. package/dist/server/services/ai-metadata-jobs.mjs +70 -0
  125. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -0
  126. package/dist/server/services/ai-metadata.js +170 -20
  127. package/dist/server/services/ai-metadata.js.map +1 -1
  128. package/dist/server/services/ai-metadata.mjs +170 -20
  129. package/dist/server/services/ai-metadata.mjs.map +1 -1
  130. package/dist/server/services/index.js +3 -1
  131. package/dist/server/services/index.js.map +1 -1
  132. package/dist/server/services/index.mjs +3 -1
  133. package/dist/server/services/index.mjs.map +1 -1
  134. package/dist/server/services/upload.js +3 -1
  135. package/dist/server/services/upload.js.map +1 -1
  136. package/dist/server/services/upload.mjs +3 -1
  137. package/dist/server/services/upload.mjs.map +1 -1
  138. package/dist/server/src/bootstrap.d.ts.map +1 -1
  139. package/dist/server/src/content-types/file.d.ts +4 -0
  140. package/dist/server/src/content-types/file.d.ts.map +1 -1
  141. package/dist/server/src/content-types/index.d.ts +4 -0
  142. package/dist/server/src/content-types/index.d.ts.map +1 -1
  143. package/dist/server/src/controllers/admin-file.d.ts +3 -0
  144. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  145. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  146. package/dist/server/src/controllers/index.d.ts +3 -0
  147. package/dist/server/src/controllers/index.d.ts.map +1 -1
  148. package/dist/server/src/controllers/validation/admin/upload.d.ts +240 -0
  149. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  150. package/dist/server/src/controllers/validation/content-api/upload.d.ts +180 -0
  151. package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
  152. package/dist/server/src/index.d.ts +32 -2
  153. package/dist/server/src/index.d.ts.map +1 -1
  154. package/dist/server/src/models/ai-metadata-job.d.ts +5 -0
  155. package/dist/server/src/models/ai-metadata-job.d.ts.map +1 -0
  156. package/dist/server/src/models/index.d.ts +5 -0
  157. package/dist/server/src/models/index.d.ts.map +1 -0
  158. package/dist/server/src/register.d.ts.map +1 -1
  159. package/dist/server/src/routes/admin.d.ts.map +1 -1
  160. package/dist/server/src/services/ai-metadata-jobs.d.ts +14 -0
  161. package/dist/server/src/services/ai-metadata-jobs.d.ts.map +1 -0
  162. package/dist/server/src/services/ai-metadata.d.ts +25 -2
  163. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  164. package/dist/server/src/services/index.d.ts +25 -2
  165. package/dist/server/src/services/index.d.ts.map +1 -1
  166. package/dist/server/src/services/upload.d.ts +1 -1
  167. package/dist/server/src/services/upload.d.ts.map +1 -1
  168. package/dist/server/src/types.d.ts +6 -0
  169. package/dist/server/src/types.d.ts.map +1 -1
  170. package/dist/server/src/utils/images.d.ts +7 -0
  171. package/dist/server/src/utils/images.d.ts.map +1 -0
  172. package/dist/server/src/utils/index.d.ts +2 -0
  173. package/dist/server/src/utils/index.d.ts.map +1 -1
  174. package/dist/server/utils/images.js +35 -0
  175. package/dist/server/utils/images.js.map +1 -0
  176. package/dist/server/utils/images.mjs +33 -0
  177. package/dist/server/utils/images.mjs.map +1 -0
  178. package/dist/server/utils/index.js.map +1 -1
  179. package/dist/server/utils/index.mjs.map +1 -1
  180. package/dist/shared/contracts/ai-metadata-jobs.d.ts +53 -0
  181. package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -0
  182. package/dist/shared/contracts/files.d.ts +39 -0
  183. package/package.json +6 -5
@@ -0,0 +1,98 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import * as React from 'react';
3
+ import { useNotification, useAPIErrorHandler, Layouts } from '@strapi/admin/strapi-admin';
4
+ import { VisuallyHidden, SimpleMenu, MenuItem } from '@strapi/design-system';
5
+ import { ChevronDown, Files } from '@strapi/icons';
6
+ import { useIntl } from 'react-intl';
7
+ import { useUploadFilesMutation } from '../services/api.mjs';
8
+ import { getTranslationKey } from '../utils/translations.mjs';
9
+
10
+ const MediaLibraryPage = ()=>{
11
+ const { formatMessage } = useIntl();
12
+ const { toggleNotification } = useNotification();
13
+ const { _unstableFormatAPIError } = useAPIErrorHandler();
14
+ const fileInputRef = React.useRef(null);
15
+ const [uploadFiles] = useUploadFilesMutation();
16
+ const handleFileSelect = ()=>{
17
+ fileInputRef.current?.click();
18
+ };
19
+ const handleFileChange = async (e)=>{
20
+ const files = e.target.files;
21
+ if (files && files.length > 0) {
22
+ const formData = new FormData();
23
+ const filesArray = Array.from(files);
24
+ // Add files and fileInfo to the form data
25
+ filesArray.forEach((file)=>{
26
+ formData.append('files', file);
27
+ formData.append('fileInfo', JSON.stringify({
28
+ name: file.name,
29
+ caption: null,
30
+ alternativeText: null,
31
+ folder: null
32
+ }));
33
+ });
34
+ try {
35
+ // unwrap() is needed to throw errors and trigger the catch block
36
+ // Without it, RTK Query never rejects and catch would never execute
37
+ await uploadFiles(formData).unwrap();
38
+ toggleNotification({
39
+ type: 'success',
40
+ message: formatMessage({
41
+ id: getTranslationKey('assets.uploaded'),
42
+ defaultMessage: '{number, plural, one {# asset} other {# assets}} uploaded successfully'
43
+ }, {
44
+ number: filesArray.length
45
+ })
46
+ });
47
+ } catch (error) {
48
+ // Format the error message using the API error handler to provide
49
+ // context-specific feedback (e.g., file size limits, format restrictions, network errors)
50
+ const errorMessage = _unstableFormatAPIError(error);
51
+ toggleNotification({
52
+ type: 'danger',
53
+ message: errorMessage
54
+ });
55
+ }
56
+ }
57
+ // Reset input so the same file can be selected again
58
+ e.target.value = '';
59
+ };
60
+ return /*#__PURE__*/ jsxs(Layouts.Root, {
61
+ children: [
62
+ /*#__PURE__*/ jsx(VisuallyHidden, {
63
+ children: /*#__PURE__*/ jsx("input", {
64
+ type: "file",
65
+ ref: fileInputRef,
66
+ onChange: handleFileChange,
67
+ multiple: true
68
+ })
69
+ }),
70
+ /*#__PURE__*/ jsx(Layouts.Header, {
71
+ title: "TODO: Folder location",
72
+ primaryAction: /*#__PURE__*/ jsx(SimpleMenu, {
73
+ popoverPlacement: "bottom-end",
74
+ variant: "default",
75
+ endIcon: /*#__PURE__*/ jsx(ChevronDown, {}),
76
+ label: formatMessage({
77
+ id: getTranslationKey('new'),
78
+ defaultMessage: 'New'
79
+ }),
80
+ children: /*#__PURE__*/ jsx(MenuItem, {
81
+ onSelect: handleFileSelect,
82
+ startIcon: /*#__PURE__*/ jsx(Files, {}),
83
+ children: formatMessage({
84
+ id: getTranslationKey('import-files'),
85
+ defaultMessage: 'Import files'
86
+ })
87
+ })
88
+ })
89
+ }),
90
+ /*#__PURE__*/ jsx(Layouts.Content, {
91
+ children: "TODO: List/Grid views"
92
+ })
93
+ ]
94
+ });
95
+ };
96
+
97
+ export { MediaLibraryPage };
98
+ //# sourceMappingURL=MediaLibraryPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPage.mjs","sources":["../../../../admin/src/future/pages/MediaLibraryPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Layouts, useNotification, useAPIErrorHandler } from '@strapi/admin/strapi-admin';\nimport { MenuItem, SimpleMenu, VisuallyHidden } from '@strapi/design-system';\nimport { ChevronDown, Files } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\n\nimport { useUploadFilesMutation } from '../services/api';\nimport { getTranslationKey } from '../utils/translations';\n\nexport const MediaLibraryPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { _unstableFormatAPIError } = useAPIErrorHandler();\n const fileInputRef = React.useRef<HTMLInputElement>(null);\n const [uploadFiles] = useUploadFilesMutation();\n\n const handleFileSelect = () => {\n fileInputRef.current?.click();\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const files = e.target.files;\n if (files && files.length > 0) {\n const formData = new FormData();\n const filesArray = Array.from(files);\n\n // Add files and fileInfo to the form data\n filesArray.forEach((file) => {\n formData.append('files', file);\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name: file.name,\n caption: null,\n alternativeText: null,\n folder: null,\n })\n );\n });\n\n try {\n // unwrap() is needed to throw errors and trigger the catch block\n // Without it, RTK Query never rejects and catch would never execute\n await uploadFiles(formData).unwrap();\n toggleNotification({\n type: 'success',\n message: formatMessage(\n {\n id: getTranslationKey('assets.uploaded'),\n defaultMessage:\n '{number, plural, one {# asset} other {# assets}} uploaded successfully',\n },\n { number: filesArray.length }\n ),\n });\n } catch (error) {\n // Format the error message using the API error handler to provide\n // context-specific feedback (e.g., file size limits, format restrictions, network errors)\n const errorMessage = _unstableFormatAPIError(error as Error);\n toggleNotification({\n type: 'danger',\n message: errorMessage,\n });\n }\n }\n // Reset input so the same file can be selected again\n e.target.value = '';\n };\n\n return (\n <Layouts.Root>\n <VisuallyHidden>\n <input type=\"file\" ref={fileInputRef} onChange={handleFileChange} multiple />\n </VisuallyHidden>\n <Layouts.Header\n title=\"TODO: Folder location\"\n primaryAction={\n <SimpleMenu\n popoverPlacement=\"bottom-end\"\n variant=\"default\"\n endIcon={<ChevronDown />}\n label={formatMessage({ id: getTranslationKey('new'), defaultMessage: 'New' })}\n >\n <MenuItem onSelect={handleFileSelect} startIcon={<Files />}>\n {formatMessage({\n id: getTranslationKey('import-files'),\n defaultMessage: 'Import files',\n })}\n </MenuItem>\n </SimpleMenu>\n }\n />\n\n <Layouts.Content>TODO: List/Grid views</Layouts.Content>\n </Layouts.Root>\n );\n};\n"],"names":["MediaLibraryPage","formatMessage","useIntl","toggleNotification","useNotification","_unstableFormatAPIError","useAPIErrorHandler","fileInputRef","React","useRef","uploadFiles","useUploadFilesMutation","handleFileSelect","current","click","handleFileChange","e","files","target","length","formData","FormData","filesArray","Array","from","forEach","file","append","JSON","stringify","name","caption","alternativeText","folder","unwrap","type","message","id","getTranslationKey","defaultMessage","number","error","errorMessage","value","_jsxs","Layouts","Root","_jsx","VisuallyHidden","input","ref","onChange","multiple","Header","title","primaryAction","SimpleMenu","popoverPlacement","variant","endIcon","ChevronDown","label","MenuItem","onSelect","startIcon","Files","Content"],"mappings":";;;;;;;;;MAUaA,gBAAmB,GAAA,IAAA;IAC9B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,uBAAuB,EAAE,GAAGC,kBAAAA,EAAAA;IACpC,MAAMC,YAAAA,GAAeC,KAAMC,CAAAA,MAAM,CAAmB,IAAA,CAAA;IACpD,MAAM,CAACC,YAAY,GAAGC,sBAAAA,EAAAA;AAEtB,IAAA,MAAMC,gBAAmB,GAAA,IAAA;AACvBL,QAAAA,YAAAA,CAAaM,OAAO,EAAEC,KAAAA,EAAAA;AACxB,KAAA;AAEA,IAAA,MAAMC,mBAAmB,OAAOC,CAAAA,GAAAA;AAC9B,QAAA,MAAMC,KAAQD,GAAAA,CAAAA,CAAEE,MAAM,CAACD,KAAK;AAC5B,QAAA,IAAIA,KAASA,IAAAA,KAAAA,CAAME,MAAM,GAAG,CAAG,EAAA;AAC7B,YAAA,MAAMC,WAAW,IAAIC,QAAAA,EAAAA;YACrB,MAAMC,UAAAA,GAAaC,KAAMC,CAAAA,IAAI,CAACP,KAAAA,CAAAA;;YAG9BK,UAAWG,CAAAA,OAAO,CAAC,CAACC,IAAAA,GAAAA;gBAClBN,QAASO,CAAAA,MAAM,CAAC,OAASD,EAAAA,IAAAA,CAAAA;AACzBN,gBAAAA,QAAAA,CAASO,MAAM,CACb,UACAC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AACbC,oBAAAA,IAAAA,EAAMJ,KAAKI,IAAI;oBACfC,OAAS,EAAA,IAAA;oBACTC,eAAiB,EAAA,IAAA;oBACjBC,MAAQ,EAAA;AACV,iBAAA,CAAA,CAAA;AAEJ,aAAA,CAAA;YAEA,IAAI;;;gBAGF,MAAMvB,WAAAA,CAAYU,UAAUc,MAAM,EAAA;gBAClC/B,kBAAmB,CAAA;oBACjBgC,IAAM,EAAA,SAAA;AACNC,oBAAAA,OAAAA,EAASnC,aACP,CAAA;AACEoC,wBAAAA,EAAAA,EAAIC,iBAAkB,CAAA,iBAAA,CAAA;wBACtBC,cACE,EAAA;qBAEJ,EAAA;AAAEC,wBAAAA,MAAAA,EAAQlB,WAAWH;AAAO,qBAAA;AAEhC,iBAAA,CAAA;AACF,aAAA,CAAE,OAAOsB,KAAO,EAAA;;;AAGd,gBAAA,MAAMC,eAAerC,uBAAwBoC,CAAAA,KAAAA,CAAAA;gBAC7CtC,kBAAmB,CAAA;oBACjBgC,IAAM,EAAA,QAAA;oBACNC,OAASM,EAAAA;AACX,iBAAA,CAAA;AACF;AACF;;QAEA1B,CAAEE,CAAAA,MAAM,CAACyB,KAAK,GAAG,EAAA;AACnB,KAAA;IAEA,qBACEC,IAAA,CAACC,QAAQC,IAAI,EAAA;;0BACXC,GAACC,CAAAA,cAAAA,EAAAA;AACC,gBAAA,QAAA,gBAAAD,GAACE,CAAAA,OAAAA,EAAAA;oBAAMd,IAAK,EAAA,MAAA;oBAAOe,GAAK3C,EAAAA,YAAAA;oBAAc4C,QAAUpC,EAAAA,gBAAAA;oBAAkBqC,QAAQ,EAAA;;;AAE5E,0BAAAL,GAAA,CAACF,QAAQQ,MAAM,EAAA;gBACbC,KAAM,EAAA,uBAAA;AACNC,gBAAAA,aAAAA,gBACER,GAACS,CAAAA,UAAAA,EAAAA;oBACCC,gBAAiB,EAAA,YAAA;oBACjBC,OAAQ,EAAA,SAAA;AACRC,oBAAAA,OAAAA,gBAASZ,GAACa,CAAAA,WAAAA,EAAAA,EAAAA,CAAAA;AACVC,oBAAAA,KAAAA,EAAO5D,aAAc,CAAA;AAAEoC,wBAAAA,EAAAA,EAAIC,iBAAkB,CAAA,KAAA,CAAA;wBAAQC,cAAgB,EAAA;AAAM,qBAAA,CAAA;AAE3E,oBAAA,QAAA,gBAAAQ,GAACe,CAAAA,QAAAA,EAAAA;wBAASC,QAAUnD,EAAAA,gBAAAA;AAAkBoD,wBAAAA,SAAAA,gBAAWjB,GAACkB,CAAAA,KAAAA,EAAAA,EAAAA,CAAAA;kCAC/ChE,aAAc,CAAA;AACboC,4BAAAA,EAAAA,EAAIC,iBAAkB,CAAA,cAAA,CAAA;4BACtBC,cAAgB,EAAA;AAClB,yBAAA;;;;AAMR,0BAAAQ,GAAA,CAACF,QAAQqB,OAAO,EAAA;AAAC,gBAAA,QAAA,EAAA;;;;AAGvB;;;;"}
@@ -0,0 +1,28 @@
1
+ 'use strict';
2
+
3
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
4
+
5
+ const uploadApi = strapiAdmin.adminApi.enhanceEndpoints({
6
+ addTagTypes: [
7
+ 'Asset',
8
+ 'Folder'
9
+ ]
10
+ }).injectEndpoints({
11
+ endpoints: (builder)=>({
12
+ uploadFiles: builder.mutation({
13
+ query: (formData)=>({
14
+ url: '/upload',
15
+ method: 'POST',
16
+ data: formData
17
+ }),
18
+ invalidatesTags: [
19
+ 'Asset'
20
+ ]
21
+ })
22
+ })
23
+ });
24
+ const { useUploadFilesMutation } = uploadApi;
25
+
26
+ exports.uploadApi = uploadApi;
27
+ exports.useUploadFilesMutation = useUploadFilesMutation;
28
+ //# sourceMappingURL=api.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.js","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport type { CreateFile } from '../../../../shared/contracts/files';\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n uploadFiles: builder.mutation<CreateFile.Response, FormData>({\n query: (formData) => ({\n url: '/upload',\n method: 'POST',\n data: formData,\n }),\n invalidatesTags: ['Asset'],\n }),\n }),\n });\n\nexport const { useUploadFilesMutation } = uploadApi;\nexport { uploadApi };\n"],"names":["uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFiles","mutation","query","formData","url","method","data","invalidatesTags","useUploadFilesMutation"],"mappings":";;;;AAIMA,MAAAA,SAAAA,GAAYC,oBACfC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA,OAAA;AAAS,QAAA;AAAS;AAClC,CAAA,CAAA,CACCC,eAAe,CAAC;IACfC,SAAW,EAAA,CAACC,WAAa;YACvBC,WAAaD,EAAAA,OAAAA,CAAQE,QAAQ,CAAgC;gBAC3DC,KAAO,EAAA,CAACC,YAAc;wBACpBC,GAAK,EAAA,SAAA;wBACLC,MAAQ,EAAA,MAAA;wBACRC,IAAMH,EAAAA;qBACR,CAAA;gBACAI,eAAiB,EAAA;AAAC,oBAAA;AAAQ;AAC5B,aAAA;SACF;AACF,CAAA;AAEW,MAAA,EAAEC,sBAAsB,EAAE,GAAGf;;;;;"}
@@ -0,0 +1,25 @@
1
+ import { adminApi } from '@strapi/admin/strapi-admin';
2
+
3
+ const uploadApi = adminApi.enhanceEndpoints({
4
+ addTagTypes: [
5
+ 'Asset',
6
+ 'Folder'
7
+ ]
8
+ }).injectEndpoints({
9
+ endpoints: (builder)=>({
10
+ uploadFiles: builder.mutation({
11
+ query: (formData)=>({
12
+ url: '/upload',
13
+ method: 'POST',
14
+ data: formData
15
+ }),
16
+ invalidatesTags: [
17
+ 'Asset'
18
+ ]
19
+ })
20
+ })
21
+ });
22
+ const { useUploadFilesMutation } = uploadApi;
23
+
24
+ export { uploadApi, useUploadFilesMutation };
25
+ //# sourceMappingURL=api.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api.mjs","sources":["../../../../admin/src/future/services/api.ts"],"sourcesContent":["import { adminApi } from '@strapi/admin/strapi-admin';\n\nimport type { CreateFile } from '../../../../shared/contracts/files';\n\nconst uploadApi = adminApi\n .enhanceEndpoints({\n addTagTypes: ['Asset', 'Folder'],\n })\n .injectEndpoints({\n endpoints: (builder) => ({\n uploadFiles: builder.mutation<CreateFile.Response, FormData>({\n query: (formData) => ({\n url: '/upload',\n method: 'POST',\n data: formData,\n }),\n invalidatesTags: ['Asset'],\n }),\n }),\n });\n\nexport const { useUploadFilesMutation } = uploadApi;\nexport { uploadApi };\n"],"names":["uploadApi","adminApi","enhanceEndpoints","addTagTypes","injectEndpoints","endpoints","builder","uploadFiles","mutation","query","formData","url","method","data","invalidatesTags","useUploadFilesMutation"],"mappings":";;AAIMA,MAAAA,SAAAA,GAAYC,QACfC,CAAAA,gBAAgB,CAAC;IAChBC,WAAa,EAAA;AAAC,QAAA,OAAA;AAAS,QAAA;AAAS;AAClC,CAAA,CAAA,CACCC,eAAe,CAAC;IACfC,SAAW,EAAA,CAACC,WAAa;YACvBC,WAAaD,EAAAA,OAAAA,CAAQE,QAAQ,CAAgC;gBAC3DC,KAAO,EAAA,CAACC,YAAc;wBACpBC,GAAK,EAAA,SAAA;wBACLC,MAAQ,EAAA,MAAA;wBACRC,IAAMH,EAAAA;qBACR,CAAA;gBACAI,eAAiB,EAAA;AAAC,oBAAA;AAAQ;AAC5B,aAAA;SACF;AACF,CAAA;AAEW,MAAA,EAAEC,sBAAsB,EAAE,GAAGf;;;;"}
@@ -0,0 +1,8 @@
1
+ 'use strict';
2
+
3
+ var pluginId = require('../../pluginId.js');
4
+
5
+ const getTranslationKey = (id)=>`${pluginId.pluginId}.${id}`;
6
+
7
+ exports.getTranslationKey = getTranslationKey;
8
+ //# sourceMappingURL=translations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.js","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;;;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,iBAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -0,0 +1,6 @@
1
+ import { pluginId } from '../../pluginId.mjs';
2
+
3
+ const getTranslationKey = (id)=>`${pluginId}.${id}`;
4
+
5
+ export { getTranslationKey };
6
+ //# sourceMappingURL=translations.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"translations.mjs","sources":["../../../../admin/src/future/utils/translations.ts"],"sourcesContent":["import { pluginId } from '../../pluginId';\n\nexport const getTranslationKey = (id: string) => `${pluginId}.${id}`;\n"],"names":["getTranslationKey","id","pluginId"],"mappings":";;AAEO,MAAMA,oBAAoB,CAACC,EAAAA,GAAe,GAAGC,QAAS,CAAA,CAAC,EAAED,EAAAA,CAAAA;;;;"}
@@ -0,0 +1,114 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var reactIntl = require('react-intl');
6
+ var reactQuery = require('react-query');
7
+ require('byte-size');
8
+ require('date-fns');
9
+ var getTrad = require('../utils/getTrad.js');
10
+ require('qs');
11
+ require('../utils/typeFromMime.js');
12
+ require('../utils/urlYupSchema.js');
13
+
14
+ function _interopNamespaceDefault(e) {
15
+ var n = Object.create(null);
16
+ if (e) {
17
+ Object.keys(e).forEach(function (k) {
18
+ if (k !== 'default') {
19
+ var d = Object.getOwnPropertyDescriptor(e, k);
20
+ Object.defineProperty(n, k, d.get ? d : {
21
+ enumerable: true,
22
+ get: function () { return e[k]; }
23
+ });
24
+ }
25
+ });
26
+ }
27
+ n.default = e;
28
+ return Object.freeze(n);
29
+ }
30
+
31
+ var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
32
+
33
+ const fetchLatestJob = async (get)=>{
34
+ try {
35
+ const { data } = await get('/upload/actions/generate-ai-metadata/latest');
36
+ return data;
37
+ } catch {
38
+ // Return null on any error - UI treats this as "no active job"
39
+ return null;
40
+ }
41
+ };
42
+ const useAIMetadataJob = (options)=>{
43
+ const { get } = strapiAdmin.useFetchClient();
44
+ const { toggleNotification } = strapiAdmin.useNotification();
45
+ const { formatMessage } = reactIntl.useIntl();
46
+ const queryClient = reactQuery.useQueryClient();
47
+ const enabled = options?.enabled ?? true;
48
+ const [previousJobStatus, setPreviousJobStatus] = React__namespace.useState(null);
49
+ // Single query with conditional polling
50
+ const { data: job, refetch } = reactQuery.useQuery([
51
+ 'ai-metadata-latest-job'
52
+ ], ()=>fetchLatestJob(get), {
53
+ enabled,
54
+ // Poll every second when job is processing
55
+ refetchInterval: (data)=>{
56
+ // If no data yet, don't poll
57
+ if (!data) return false;
58
+ // Poll while processing
59
+ if (data.status === 'processing') {
60
+ return 1000;
61
+ }
62
+ // Stop polling when completed or failed
63
+ return false;
64
+ },
65
+ retry: false,
66
+ refetchOnWindowFocus: false
67
+ });
68
+ const currentJobStatus = job?.status ?? null;
69
+ // Detect status transitions and show notifications
70
+ React__namespace.useEffect(()=>{
71
+ if (!currentJobStatus) return;
72
+ // Detect transition from active state to completed
73
+ if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {
74
+ toggleNotification({
75
+ type: 'success',
76
+ message: formatMessage({
77
+ id: getTrad.getTrad('settings.form.aiMetadata.job-completed'),
78
+ defaultMessage: 'Successfully generated metadata'
79
+ })
80
+ });
81
+ // Invalidate metadata count query to refresh the count
82
+ queryClient.invalidateQueries([
83
+ 'ai-metadata-count'
84
+ ]);
85
+ }
86
+ // Detect transition from active state to failed
87
+ if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {
88
+ toggleNotification({
89
+ type: 'danger',
90
+ message: formatMessage({
91
+ id: getTrad.getTrad('settings.form.aiMetadata.job-failed'),
92
+ defaultMessage: 'Failed to generate metadata. Please try again.'
93
+ })
94
+ });
95
+ }
96
+ // Update previous status if it changed
97
+ if (previousJobStatus !== currentJobStatus) {
98
+ setPreviousJobStatus(currentJobStatus);
99
+ }
100
+ }, [
101
+ currentJobStatus,
102
+ previousJobStatus,
103
+ toggleNotification,
104
+ formatMessage,
105
+ queryClient
106
+ ]);
107
+ return {
108
+ data: job,
109
+ refetch
110
+ };
111
+ };
112
+
113
+ exports.useAIMetadataJob = useAIMetadataJob;
114
+ //# sourceMappingURL=useAIMetadataJob.js.map
@@ -0,0 +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,GAAI,CAAA,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,KAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT;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,WAAcC,GAAAA,yBAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAW,IAAA,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,gBAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAMe,EAAAA,GAAG,EAAEC,OAAO,EAAE,GAAGC,mBAC7B,CAAA;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GACrB,CAAA,EAAA;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAc,EAAA;gBAChC,OAAO,IAAA;AACT;;YAGA,OAAO,KAAA;AACT,SAAA;QACAC,KAAO,EAAA,KAAA;QACPC,oBAAsB,EAAA;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAU,IAAA,IAAA;;AAGxCN,IAAAA,gBAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAkB,EAAA;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,WAAa,EAAA;YAC1ElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,wCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,QAAU,EAAA;YACvElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,qCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAkB,EAAA;YAC1CV,oBAAqBU,CAAAA,gBAAAA,CAAAA;AACvB;KACC,EAAA;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAMe,EAAAA,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -0,0 +1,93 @@
1
+ import * as React from 'react';
2
+ import { useFetchClient, useNotification } from '@strapi/admin/strapi-admin';
3
+ import { useIntl } from 'react-intl';
4
+ import { useQueryClient, useQuery } from 'react-query';
5
+ import 'byte-size';
6
+ import 'date-fns';
7
+ import { getTrad } from '../utils/getTrad.mjs';
8
+ import 'qs';
9
+ import '../utils/typeFromMime.mjs';
10
+ import '../utils/urlYupSchema.mjs';
11
+
12
+ const fetchLatestJob = async (get)=>{
13
+ try {
14
+ const { data } = await get('/upload/actions/generate-ai-metadata/latest');
15
+ return data;
16
+ } catch {
17
+ // Return null on any error - UI treats this as "no active job"
18
+ return null;
19
+ }
20
+ };
21
+ const useAIMetadataJob = (options)=>{
22
+ const { get } = useFetchClient();
23
+ const { toggleNotification } = useNotification();
24
+ const { formatMessage } = useIntl();
25
+ const queryClient = useQueryClient();
26
+ const enabled = options?.enabled ?? true;
27
+ const [previousJobStatus, setPreviousJobStatus] = React.useState(null);
28
+ // Single query with conditional polling
29
+ const { data: job, refetch } = useQuery([
30
+ 'ai-metadata-latest-job'
31
+ ], ()=>fetchLatestJob(get), {
32
+ enabled,
33
+ // Poll every second when job is processing
34
+ refetchInterval: (data)=>{
35
+ // If no data yet, don't poll
36
+ if (!data) return false;
37
+ // Poll while processing
38
+ if (data.status === 'processing') {
39
+ return 1000;
40
+ }
41
+ // Stop polling when completed or failed
42
+ return false;
43
+ },
44
+ retry: false,
45
+ refetchOnWindowFocus: false
46
+ });
47
+ const currentJobStatus = job?.status ?? null;
48
+ // Detect status transitions and show notifications
49
+ React.useEffect(()=>{
50
+ if (!currentJobStatus) return;
51
+ // Detect transition from active state to completed
52
+ if (previousJobStatus === 'processing' && currentJobStatus === 'completed') {
53
+ toggleNotification({
54
+ type: 'success',
55
+ message: formatMessage({
56
+ id: getTrad('settings.form.aiMetadata.job-completed'),
57
+ defaultMessage: 'Successfully generated metadata'
58
+ })
59
+ });
60
+ // Invalidate metadata count query to refresh the count
61
+ queryClient.invalidateQueries([
62
+ 'ai-metadata-count'
63
+ ]);
64
+ }
65
+ // Detect transition from active state to failed
66
+ if (previousJobStatus === 'processing' && currentJobStatus === 'failed') {
67
+ toggleNotification({
68
+ type: 'danger',
69
+ message: formatMessage({
70
+ id: getTrad('settings.form.aiMetadata.job-failed'),
71
+ defaultMessage: 'Failed to generate metadata. Please try again.'
72
+ })
73
+ });
74
+ }
75
+ // Update previous status if it changed
76
+ if (previousJobStatus !== currentJobStatus) {
77
+ setPreviousJobStatus(currentJobStatus);
78
+ }
79
+ }, [
80
+ currentJobStatus,
81
+ previousJobStatus,
82
+ toggleNotification,
83
+ formatMessage,
84
+ queryClient
85
+ ]);
86
+ return {
87
+ data: job,
88
+ refetch
89
+ };
90
+ };
91
+
92
+ export { useAIMetadataJob };
93
+ //# sourceMappingURL=useAIMetadataJob.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAIMetadataJob.mjs","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,GAAI,CAAA,6CAAA,CAAA;QAC3B,OAAOC,IAAAA;AACT,KAAA,CAAE,OAAM;;QAEN,OAAO,IAAA;AACT;AACF,CAAA;AAEO,MAAMC,mBAAmB,CAACC,OAAAA,GAAAA;IAC/B,MAAM,EAAEH,GAAG,EAAE,GAAGI,cAAAA,EAAAA;IAChB,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;IAC/B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,WAAcC,GAAAA,cAAAA,EAAAA;IACpB,MAAMC,OAAAA,GAAUR,SAASQ,OAAW,IAAA,IAAA;AAEpC,IAAA,MAAM,CAACC,iBAAmBC,EAAAA,oBAAAA,CAAqB,GAAGC,KAAAA,CAAMC,QAAQ,CAC9D,IAAA,CAAA;;AAIF,IAAA,MAAM,EAAEd,IAAMe,EAAAA,GAAG,EAAEC,OAAO,EAAE,GAAGC,QAC7B,CAAA;AAAC,QAAA;KAAyB,EAC1B,IAAMnB,eAAeC,GACrB,CAAA,EAAA;AACEW,QAAAA,OAAAA;;AAEAQ,QAAAA,eAAAA,EAAiB,CAAClB,IAAAA,GAAAA;;YAEhB,IAAI,CAACA,MAAM,OAAO,KAAA;;YAGlB,IAAIA,IAAAA,CAAKmB,MAAM,KAAK,YAAc,EAAA;gBAChC,OAAO,IAAA;AACT;;YAGA,OAAO,KAAA;AACT,SAAA;QACAC,KAAO,EAAA,KAAA;QACPC,oBAAsB,EAAA;AACxB,KAAA,CAAA;IAGF,MAAMC,gBAAAA,GAAmBP,KAAKI,MAAU,IAAA,IAAA;;AAGxCN,IAAAA,KAAAA,CAAMU,SAAS,CAAC,IAAA;AACd,QAAA,IAAI,CAACD,gBAAkB,EAAA;;QAGvB,IAAIX,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,WAAa,EAAA;YAC1ElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,wCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;;AAEApB,YAAAA,WAAAA,CAAYqB,iBAAiB,CAAC;AAAC,gBAAA;AAAoB,aAAA,CAAA;AACrD;;QAGA,IAAIlB,iBAAAA,KAAsB,YAAgBW,IAAAA,gBAAAA,KAAqB,QAAU,EAAA;YACvElB,kBAAmB,CAAA;gBACjBoB,IAAM,EAAA,QAAA;AACNC,gBAAAA,OAAAA,EAASnB,aAAc,CAAA;AACrBoB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,qCAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;;AAGA,QAAA,IAAIjB,sBAAsBW,gBAAkB,EAAA;YAC1CV,oBAAqBU,CAAAA,gBAAAA,CAAAA;AACvB;KACC,EAAA;AAACA,QAAAA,gBAAAA;AAAkBX,QAAAA,iBAAAA;AAAmBP,QAAAA,kBAAAA;AAAoBE,QAAAA,aAAAA;AAAeE,QAAAA;AAAY,KAAA,CAAA;IAExF,OAAO;QACLR,IAAMe,EAAAA,GAAAA;AACNC,QAAAA;AACF,KAAA;AACF;;;;"}
@@ -40,6 +40,7 @@ const editAssetRequest = (asset, file, signal, onProgress, post)=>{
40
40
  formData.append('fileInfo', JSON.stringify({
41
41
  alternativeText: asset.alternativeText,
42
42
  caption: asset.caption,
43
+ focalPoint: asset.focalPoint,
43
44
  folder: asset.folder,
44
45
  name: asset.name
45
46
  }));
@@ -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 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","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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA,MAAMA,gBAAmB,GAAA,CACvBC,KACAC,EAAAA,IAAAA,EACAC,QACAC,UACAC,EAAAA,IAAAA,GAAAA;IAEA,MAAMC,QAAAA,GAAW,CAAC,CAAC,EAAEC,kBAAS,IAAI,EAAEN,KAAMO,CAAAA,EAAE,CAAE,CAAA;AAE9C,IAAA,MAAMC,WAAW,IAAIC,QAAAA,EAAAA;AAErB,IAAA,IAAIR,IAAM,EAAA;QACRO,QAASE,CAAAA,MAAM,CAAC,OAAST,EAAAA,IAAAA,CAAAA;AAC3B;AAEAO,IAAAA,QAAAA,CAASE,MAAM,CACb,UACAC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AACbC,QAAAA,eAAAA,EAAiBb,MAAMa,eAAe;AACtCC,QAAAA,OAAAA,EAASd,MAAMc,OAAO;AACtBC,QAAAA,UAAAA,EAAYf,MAAMe,UAAU;AAC5BC,QAAAA,MAAAA,EAAQhB,MAAMgB,MAAM;AACpBC,QAAAA,IAAAA,EAAMjB,MAAMiB;AACd,KAAA,CAAA,CAAA;AAGF;;;;MAKA,OAAOb,IAAKC,CAAAA,QAAAA,EAAUG,QAAU,EAAA;AAC9BN,QAAAA;AACF,KAAA,CAAA,CAAGgB,IAAI,CAAC,CAACC,GAAAA,GAAQA,IAAIC,IAAI,CAAA;AAC3B,CAAA;MAEaC,YAAe,GAAA,IAAA;AAC1B,IAAA,MAAM,CAACC,QAAUC,EAAAA,WAAAA,CAAY,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,CAAA,CAAA;IAC/C,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAcC,GAAAA,yBAAAA,EAAAA;AACpB,IAAA,MAAMC,kBAAkB,IAAIC,eAAAA,EAAAA;IAC5B,MAAM/B,MAAAA,GAAS8B,gBAAgB9B,MAAM;IACrC,MAAM,EAAEE,IAAI,EAAE,GAAG8B,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,QAAWC,GAAAA,sBAAAA,CAIf,CAAC,EAAEpC,KAAK,EAAEC,IAAI,EAAE,GAAKF,gBAAiBC,CAAAA,KAAAA,EAAOC,IAAMC,EAAAA,MAAAA,EAAQqB,aAAanB,IAAO,CAAA,EAAA;AAC/EiC,QAAAA,SAAAA,CAAAA,GAAAA;AACEP,YAAAA,WAAAA,CAAYQ,cAAc,CAAC;AAAChC,gBAAAA,iBAAAA;AAAU,gBAAA;aAAS,EAAE;gBAAEiC,MAAQ,EAAA;AAAK,aAAA,CAAA;AAChET,YAAAA,WAAAA,CAAYQ,cAAc,CAAC;AAAChC,gBAAAA,iBAAAA;AAAU,gBAAA;aAAc,EAAE;gBAAEiC,MAAQ,EAAA;AAAK,aAAA,CAAA;AACrET,YAAAA,WAAAA,CAAYQ,cAAc,CAAC;AAAChC,gBAAAA,iBAAAA;AAAU,gBAAA;aAAU,EAAE;gBAAEiC,MAAQ,EAAA;AAAK,aAAA,CAAA;AACnE,SAAA;AACAC,QAAAA,OAAAA,CAAAA,CAAQC,MAAM,EAAA;YACZ,IAAIA,MAAAA,EAAQC,QAAUC,EAAAA,MAAAA,KAAW,GAAK,EAAA;gBACpCf,kBAAmB,CAAA;oBACjBgB,IAAM,EAAA,MAAA;AACNC,oBAAAA,OAAAA,EAASnB,aAAc,CAAA;AAAEnB,wBAAAA,EAAAA,EAAIuC,eAAQ,CAAA,gCAAA;AAAkC,qBAAA;AACzE,iBAAA,CAAA;aACK,MAAA;gBACLlB,kBAAmB,CAAA;oBAAEgB,IAAM,EAAA,QAAA;AAAUC,oBAAAA,OAAAA,EAASJ,MAAQI,EAAAA;AAAQ,iBAAA,CAAA;AAChE;AACF;AACF,KAAA,CAAA;AAEA,IAAA,MAAME,YAAY,CAAC/C,KAAAA,EAAkBC,IAAekC,GAAAA,QAAAA,CAASa,WAAW,CAAC;AAAEhD,YAAAA,KAAAA;AAAOC,YAAAA;AAAK,SAAA,CAAA;IAEvF,MAAMgD,MAAAA,GAAS,IAAMjB,eAAAA,CAAgBkB,KAAK,EAAA;IAE1C,OAAO;AAAE,QAAA,GAAGf,QAAQ;AAAEc,QAAAA,MAAAA;AAAQF,QAAAA,SAAAA;AAAWzB,QAAAA,QAAAA;AAAUqB,QAAAA,MAAAA,EAAQR,SAASQ;AAAO,KAAA;AAC7E;;;;"}
@@ -19,6 +19,7 @@ const editAssetRequest = (asset, file, signal, onProgress, post)=>{
19
19
  formData.append('fileInfo', JSON.stringify({
20
20
  alternativeText: asset.alternativeText,
21
21
  caption: asset.caption,
22
+ focalPoint: asset.focalPoint,
22
23
  folder: asset.folder,
23
24
  name: asset.name
24
25
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"useEditAsset.mjs","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 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","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.mjs","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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"}
@@ -16,7 +16,7 @@ require('./utils/urlYupSchema.js');
16
16
 
17
17
  function _interopNamespaceDefaultOnly (e) { return Object.freeze({ __proto__: null, default: e }); }
18
18
 
19
- function __variableDynamicImportRuntime2__(path) {
19
+ function __variableDynamicImportRuntime3__(path) {
20
20
  switch (path) {
21
21
  case './translations/ca.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/ca.json.js')); });
22
22
  case './translations/de.json': return Promise.resolve().then(function () { return /*#__PURE__*/_interopNamespaceDefaultOnly(require('./translations/de.json.js')); });
@@ -57,11 +57,30 @@ const admin = {
57
57
  defaultMessage: 'Media Library'
58
58
  },
59
59
  permissions: constants.PERMISSIONS.main,
60
- Component: ()=>Promise.resolve().then(function () { return require('./pages/App/App.js'); }).then((mod)=>({
60
+ Component: ()=>{
61
+ return Promise.resolve().then(function () { return require('./pages/App/App.js'); }).then((mod)=>({
61
62
  default: mod.Upload
62
- })),
63
+ }));
64
+ },
63
65
  position: 4
64
66
  });
67
+ if (window.strapi.future.isEnabled('unstableMediaLibrary')) {
68
+ app.addMenuLink({
69
+ to: `plugins/unstable-${pluginId.pluginId}`,
70
+ icon: icons.WarningCircle,
71
+ intlLabel: {
72
+ id: `${pluginId.pluginId}.plugin.name`,
73
+ defaultMessage: 'Media Library'
74
+ },
75
+ permissions: constants.PERMISSIONS.main,
76
+ Component: ()=>{
77
+ return Promise.resolve().then(function () { return require('./future/App.js'); }).then((mod)=>({
78
+ default: mod.UnstableMediaLibrary
79
+ }));
80
+ },
81
+ position: 5
82
+ });
83
+ }
65
84
  app.addSettingsLink('global', {
66
85
  id: 'media-library-settings',
67
86
  to: 'media-library',
@@ -94,7 +113,7 @@ const admin = {
94
113
  },
95
114
  async registerTrads ({ locales }) {
96
115
  const importedTrads = await Promise.all(locales.map((locale)=>{
97
- return __variableDynamicImportRuntime2__(`./translations/${locale}.json`).then(({ default: data })=>{
116
+ return __variableDynamicImportRuntime3__(`./translations/${locale}.json`).then(({ default: data })=>{
98
117
  return {
99
118
  data: prefixPluginTranslations.prefixPluginTranslations(data, pluginId.pluginId),
100
119
  locale
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => import('./pages/App/App').then((mod) => ({ default: mod.Upload })),\n position: 4,\n });\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n async Component() {\n const { ProtectedSettingsPage } = await import('./pages/SettingsPage/SettingsPage');\n return { default: ProtectedSettingsPage };\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","position","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","addComponents","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAMA,IAAOC,GAAAA,gBAAAA,CAAUC,MAAM,CAACF,IAAI;AAElC,MAAMG,KAAkC,GAAA;AACtCC,IAAAA,QAAAA,CAAAA,CAASC,GAAc,EAAA;AACrBA,QAAAA,GAAAA,CAAIC,WAAW,CAAC;YACdC,EAAI,EAAA,CAAC,QAAQ,EAAEC,iBAAU,CAAA,CAAA;YACzBC,IAAMC,EAAAA,YAAAA;YACNC,SAAW,EAAA;gBACTC,EAAI,EAAA,CAAA,EAAGJ,iBAAS,CAAA,YAAY,CAAC;gBAC7BK,cAAgB,EAAA;AAClB,aAAA;AACAC,YAAAA,WAAAA,EAAaC,sBAAYC,IAAI;YAC7BC,SAAW,EAAA,IAAM,oDAAO,oBAAA,KAAA,CAAmBC,IAAI,CAAC,CAACC,OAAS;AAAEC,wBAAAA,OAAAA,EAASD,IAAIE;qBAAO,CAAA,CAAA;YAChFC,QAAU,EAAA;AACZ,SAAA,CAAA;QAEAjB,GAAIkB,CAAAA,eAAe,CAAC,QAAU,EAAA;YAC5BX,EAAI,EAAA,wBAAA;YACJL,EAAI,EAAA,eAAA;YACJI,SAAW,EAAA;AACTC,gBAAAA,EAAAA,EAAIY,eAAQ,CAAA,aAAA,CAAA;gBACZX,cAAgB,EAAA;AAClB,aAAA;YACA,MAAMI,SAAAA,CAAAA,GAAAA;AACJ,gBAAA,MAAM,EAAEQ,qBAAqB,EAAE,GAAG,MAAM,oDAAO,sCAAA,KAAA;gBAC/C,OAAO;oBAAEL,OAASK,EAAAA;AAAsB,iBAAA;AAC1C,aAAA;AACAX,YAAAA,WAAAA,EAAaC,sBAAYW;AAC3B,SAAA,CAAA;AAEArB,QAAAA,GAAAA,CAAIsB,SAAS,CAAC;YACZC,IAAM,EAAA,OAAA;YACNX,SAAWY,EAAAA;AACb,SAAA,CAAA;AACAxB,QAAAA,GAAAA,CAAIyB,aAAa,CAAC;AAChB,YAAA;gBACE9B,IAAM,EAAA,eAAA;gBACNiB,SAAWc,EAAAA;AACb;AACD,SAAA,CAAA;AAED1B,QAAAA,GAAAA,CAAI2B,cAAc,CAAC;YACjBpB,EAAIJ,EAAAA,iBAAAA;AACJR,YAAAA;AACF,SAAA,CAAA;AACF,KAAA;IACA,MAAMiC,aAAAA,CAAAA,CAAc,EAAEC,OAAO,EAAyB,EAAA;QACpD,MAAMC,aAAAA,GAAgB,MAAMC,OAAQC,CAAAA,GAAG,CACrCH,OAAQI,CAAAA,GAAG,CAAC,CAACC,MAAAA,GAAAA;AACX,YAAA,OAAO,iCAAM,CAAC,CAAC,eAAe,EAAEA,MAAO,CAAA,KAAK,CAAC,CAAA,CAC1CrB,IAAI,CAAC,CAAC,EAAEE,OAAAA,EAASoB,IAAI,EAAE,GAAA;gBACtB,OAAO;AACLA,oBAAAA,IAAAA,EAAMC,kDAAyBD,IAAMhC,EAAAA,iBAAAA,CAAAA;AACrC+B,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA,CACCG,KAAK,CAAC,IAAA;gBACL,OAAO;AACLF,oBAAAA,IAAAA,EAAM,EAAC;AACPD,oBAAAA;AACF,iBAAA;AACF,aAAA,CAAA;AACJ,SAAA,CAAA,CAAA;QAGF,OAAOH,OAAAA,CAAQO,OAAO,CAACR,aAAAA,CAAAA;AACzB;AACF;;;;"}
1
+ {"version":3,"file":"index.js","sources":["../../admin/src/index.ts"],"sourcesContent":["import { Images, WarningCircle } from '@strapi/icons';\n\nimport pluginPkg from '../../package.json';\n\nimport { MediaLibraryDialog } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport { MediaLibraryInput } from './components/MediaLibraryInput/MediaLibraryInput';\nimport { PERMISSIONS } from './constants';\nimport { pluginId } from './pluginId';\nimport { getTrad, prefixPluginTranslations } from './utils';\n\nimport type { MediaLibraryDialogProps } from './components/MediaLibraryDialog/MediaLibraryDialog';\nimport type { MediaLibraryInputProps } from './components/MediaLibraryInput/MediaLibraryInput';\nimport type { StrapiApp } from '@strapi/admin/strapi-admin';\nimport type { Plugin } from '@strapi/types';\n\nconst name = pluginPkg.strapi.name;\n\nconst admin: Plugin.Config.AdminInput = {\n register(app: StrapiApp) {\n app.addMenuLink({\n to: `plugins/${pluginId}`,\n icon: Images,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./pages/App/App').then((mod) => ({ default: mod.Upload }));\n },\n position: 4,\n });\n\n if (window.strapi.future.isEnabled('unstableMediaLibrary')) {\n app.addMenuLink({\n to: `plugins/unstable-${pluginId}`,\n icon: WarningCircle,\n intlLabel: {\n id: `${pluginId}.plugin.name`,\n defaultMessage: 'Media Library',\n },\n permissions: PERMISSIONS.main,\n Component: () => {\n return import('./future/App').then((mod) => ({\n default: mod.UnstableMediaLibrary,\n }));\n },\n position: 5,\n });\n }\n\n app.addSettingsLink('global', {\n id: 'media-library-settings',\n to: 'media-library',\n intlLabel: {\n id: getTrad('plugin.name'),\n defaultMessage: 'Media Library',\n },\n async Component() {\n const { ProtectedSettingsPage } = await import('./pages/SettingsPage/SettingsPage');\n return { default: ProtectedSettingsPage };\n },\n permissions: PERMISSIONS.settings,\n });\n\n app.addFields({\n type: 'media',\n Component: MediaLibraryInput as React.FC<Partial<MediaLibraryInputProps>>,\n });\n app.addComponents([\n {\n name: 'media-library',\n Component: MediaLibraryDialog as React.FC<Partial<MediaLibraryDialogProps>>,\n },\n ]);\n\n app.registerPlugin({\n id: pluginId,\n name,\n });\n },\n async registerTrads({ locales }: { locales: string[] }) {\n const importedTrads = await Promise.all(\n locales.map((locale) => {\n return import(`./translations/${locale}.json`)\n .then(({ default: data }) => {\n return {\n data: prefixPluginTranslations(data, pluginId),\n locale,\n };\n })\n .catch(() => {\n return {\n data: {},\n locale,\n };\n });\n })\n );\n\n return Promise.resolve(importedTrads);\n },\n};\n\n// eslint-disable-next-line import/no-default-export\nexport default admin;\n"],"names":["name","pluginPkg","strapi","admin","register","app","addMenuLink","to","pluginId","icon","Images","intlLabel","id","defaultMessage","permissions","PERMISSIONS","main","Component","then","mod","default","Upload","position","window","future","isEnabled","WarningCircle","UnstableMediaLibrary","addSettingsLink","getTrad","ProtectedSettingsPage","settings","addFields","type","MediaLibraryInput","addComponents","MediaLibraryDialog","registerPlugin","registerTrads","locales","importedTrads","Promise","all","map","locale","data","prefixPluginTranslations","catch","resolve"],"mappings":"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"}