@strapi/upload 5.26.0 → 5.28.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 (146) hide show
  1. package/dist/admin/ai/components/AIAssetCard.js +589 -0
  2. package/dist/admin/ai/components/AIAssetCard.js.map +1 -0
  3. package/dist/admin/ai/components/AIAssetCard.mjs +567 -0
  4. package/dist/admin/ai/components/AIAssetCard.mjs.map +1 -0
  5. package/dist/admin/ai/components/AIUploadModal.js +363 -0
  6. package/dist/admin/ai/components/AIUploadModal.js.map +1 -0
  7. package/dist/admin/ai/components/AIUploadModal.mjs +341 -0
  8. package/dist/admin/ai/components/AIUploadModal.mjs.map +1 -0
  9. package/dist/admin/components/AssetDialog/AssetDialog.js +1 -1
  10. package/dist/admin/components/AssetDialog/AssetDialog.js.map +1 -1
  11. package/dist/admin/components/AssetDialog/AssetDialog.mjs +1 -1
  12. package/dist/admin/components/AssetDialog/AssetDialog.mjs.map +1 -1
  13. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js +3 -3
  14. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.js.map +1 -1
  15. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs +4 -4
  16. package/dist/admin/components/Breadcrumbs/CrumbSimpleMenuAsync.mjs.map +1 -1
  17. package/dist/admin/components/EditAssetDialog/EditAssetContent.js +5 -5
  18. package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
  19. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +5 -5
  20. package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
  21. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js +2 -1
  22. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.js.map +1 -1
  23. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs +2 -1
  24. package/dist/admin/components/MediaLibraryInput/Carousel/CarouselAssets.mjs.map +1 -1
  25. package/dist/admin/components/SelectTree/utils/flattenTree.js +11 -6
  26. package/dist/admin/components/SelectTree/utils/flattenTree.js.map +1 -1
  27. package/dist/admin/components/SelectTree/utils/flattenTree.mjs +11 -6
  28. package/dist/admin/components/SelectTree/utils/flattenTree.mjs.map +1 -1
  29. package/dist/admin/hooks/useAiAvailability.js +22 -0
  30. package/dist/admin/hooks/useAiAvailability.js.map +1 -0
  31. package/dist/admin/hooks/useAiAvailability.mjs +20 -0
  32. package/dist/admin/hooks/useAiAvailability.mjs.map +1 -0
  33. package/dist/admin/hooks/useBulkEdit.js +66 -0
  34. package/dist/admin/hooks/useBulkEdit.js.map +1 -0
  35. package/dist/admin/hooks/useBulkEdit.mjs +64 -0
  36. package/dist/admin/hooks/useBulkEdit.mjs.map +1 -0
  37. package/dist/admin/hooks/useSettings.js +22 -0
  38. package/dist/admin/hooks/useSettings.js.map +1 -0
  39. package/dist/admin/hooks/useSettings.mjs +20 -0
  40. package/dist/admin/hooks/useSettings.mjs.map +1 -0
  41. package/dist/admin/hooks/useUpload.js +25 -14
  42. package/dist/admin/hooks/useUpload.js.map +1 -1
  43. package/dist/admin/hooks/useUpload.mjs +25 -14
  44. package/dist/admin/hooks/useUpload.mjs.map +1 -1
  45. package/dist/admin/package.json.js +5 -5
  46. package/dist/admin/package.json.mjs +5 -5
  47. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +0 -1
  48. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  49. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +0 -1
  50. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  51. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js +19 -5
  52. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.js.map +1 -1
  53. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs +19 -5
  54. package/dist/admin/pages/App/MediaLibrary/MediaLibrary.mjs.map +1 -1
  55. package/dist/admin/pages/SettingsPage/SettingsPage.js +222 -144
  56. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  57. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +225 -147
  58. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  59. package/dist/admin/pages/SettingsPage/reducer.js +9 -10
  60. package/dist/admin/pages/SettingsPage/reducer.js.map +1 -1
  61. package/dist/admin/pages/SettingsPage/reducer.mjs +9 -10
  62. package/dist/admin/pages/SettingsPage/reducer.mjs.map +1 -1
  63. package/dist/admin/src/ai/components/AIAssetCard.d.ts +13 -0
  64. package/dist/admin/src/ai/components/AIUploadModal.d.ts +55 -0
  65. package/dist/admin/src/components/EditAssetDialog/EditAssetContent.d.ts +3 -1
  66. package/dist/admin/src/components/SelectTree/utils/flattenTree.d.ts +3 -1
  67. package/dist/admin/src/hooks/useAiAvailability.d.ts +4 -0
  68. package/dist/admin/src/hooks/useBulkEdit.d.ts +91 -0
  69. package/dist/admin/src/hooks/useSettings.d.ts +7 -0
  70. package/dist/admin/src/hooks/useUpload.d.ts +1 -1
  71. package/dist/admin/src/pages/SettingsPage/reducer.d.ts +3 -12
  72. package/dist/admin/translations/en.json.js +7 -1
  73. package/dist/admin/translations/en.json.js.map +1 -1
  74. package/dist/admin/translations/en.json.mjs +7 -1
  75. package/dist/admin/translations/en.json.mjs.map +1 -1
  76. package/dist/admin/utils/getFolderParents.js +2 -1
  77. package/dist/admin/utils/getFolderParents.js.map +1 -1
  78. package/dist/admin/utils/getFolderParents.mjs +2 -1
  79. package/dist/admin/utils/getFolderParents.mjs.map +1 -1
  80. package/dist/server/bootstrap.js +2 -1
  81. package/dist/server/bootstrap.js.map +1 -1
  82. package/dist/server/bootstrap.mjs +2 -1
  83. package/dist/server/bootstrap.mjs.map +1 -1
  84. package/dist/server/controllers/admin-upload.js +57 -2
  85. package/dist/server/controllers/admin-upload.js.map +1 -1
  86. package/dist/server/controllers/admin-upload.mjs +59 -4
  87. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  88. package/dist/server/controllers/content-api.js +3 -1
  89. package/dist/server/controllers/content-api.js.map +1 -1
  90. package/dist/server/controllers/content-api.mjs +3 -1
  91. package/dist/server/controllers/content-api.mjs.map +1 -1
  92. package/dist/server/controllers/validation/admin/settings.js +2 -1
  93. package/dist/server/controllers/validation/admin/settings.js.map +1 -1
  94. package/dist/server/controllers/validation/admin/settings.mjs +2 -1
  95. package/dist/server/controllers/validation/admin/settings.mjs.map +1 -1
  96. package/dist/server/controllers/validation/admin/upload.js +8 -0
  97. package/dist/server/controllers/validation/admin/upload.js.map +1 -1
  98. package/dist/server/controllers/validation/admin/upload.mjs +8 -1
  99. package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
  100. package/dist/server/routes/admin.js +18 -0
  101. package/dist/server/routes/admin.js.map +1 -1
  102. package/dist/server/routes/admin.mjs +18 -0
  103. package/dist/server/routes/admin.mjs.map +1 -1
  104. package/dist/server/services/ai-metadata.js +97 -0
  105. package/dist/server/services/ai-metadata.js.map +1 -0
  106. package/dist/server/services/ai-metadata.mjs +95 -0
  107. package/dist/server/services/ai-metadata.mjs.map +1 -0
  108. package/dist/server/services/index.js +3 -1
  109. package/dist/server/services/index.js.map +1 -1
  110. package/dist/server/services/index.mjs +3 -1
  111. package/dist/server/services/index.mjs.map +1 -1
  112. package/dist/server/services/upload.js.map +1 -1
  113. package/dist/server/services/upload.mjs.map +1 -1
  114. package/dist/server/services/weekly-metrics.js +5 -1
  115. package/dist/server/services/weekly-metrics.js.map +1 -1
  116. package/dist/server/services/weekly-metrics.mjs +5 -1
  117. package/dist/server/services/weekly-metrics.mjs.map +1 -1
  118. package/dist/server/src/bootstrap.d.ts.map +1 -1
  119. package/dist/server/src/controllers/admin-upload.d.ts +1 -0
  120. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  121. package/dist/server/src/controllers/index.d.ts +1 -0
  122. package/dist/server/src/controllers/index.d.ts.map +1 -1
  123. package/dist/server/src/controllers/validation/admin/settings.d.ts +3 -0
  124. package/dist/server/src/controllers/validation/admin/settings.d.ts.map +1 -1
  125. package/dist/server/src/controllers/validation/admin/upload.d.ts +42 -0
  126. package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
  127. package/dist/server/src/index.d.ts +14 -1
  128. package/dist/server/src/index.d.ts.map +1 -1
  129. package/dist/server/src/routes/admin.d.ts.map +1 -1
  130. package/dist/server/src/services/ai-metadata.d.ts +13 -0
  131. package/dist/server/src/services/ai-metadata.d.ts.map +1 -0
  132. package/dist/server/src/services/index.d.ts +13 -1
  133. package/dist/server/src/services/index.d.ts.map +1 -1
  134. package/dist/server/src/services/upload.d.ts +2 -1
  135. package/dist/server/src/services/upload.d.ts.map +1 -1
  136. package/dist/server/src/services/weekly-metrics.d.ts +1 -0
  137. package/dist/server/src/services/weekly-metrics.d.ts.map +1 -1
  138. package/dist/server/src/types.d.ts +1 -0
  139. package/dist/server/src/types.d.ts.map +1 -1
  140. package/dist/server/src/utils/index.d.ts +2 -0
  141. package/dist/server/src/utils/index.d.ts.map +1 -1
  142. package/dist/server/utils/index.js.map +1 -1
  143. package/dist/server/utils/index.mjs.map +1 -1
  144. package/dist/shared/contracts/files.d.ts +22 -0
  145. package/dist/shared/contracts/settings.d.ts +2 -0
  146. package/package.json +5 -5
@@ -33,6 +33,7 @@ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disa
33
33
  const { formatMessage } = reactIntl.useIntl();
34
34
  const [isEditingAsset, setIsEditingAsset] = React__namespace.useState(false);
35
35
  const currentAsset = assets[selectedAssetIndex];
36
+ const canEditMedia = !disabled && onEditAsset;
36
37
  return /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
37
38
  children: [
38
39
  /*#__PURE__*/ jsxRuntime.jsx(designSystem.CarouselInput, {
@@ -58,7 +59,7 @@ const CarouselAssets = /*#__PURE__*/ React__namespace.forwardRef(({ assets, disa
58
59
  asset: currentAsset,
59
60
  onDeleteAsset: disabled ? undefined : onDeleteAsset,
60
61
  onAddAsset: disabled ? undefined : onAddAsset,
61
- onEditAsset: onEditAsset ? ()=>setIsEditingAsset(true) : undefined
62
+ onEditAsset: canEditMedia ? ()=>setIsEditingAsset(true) : undefined
62
63
  }) : undefined,
63
64
  children: assets.length === 0 ? /*#__PURE__*/ jsxRuntime.jsx(designSystem.CarouselSlide, {
64
65
  label: formatMessage({
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselAssets.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={onEditAsset ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":"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"}
1
+ {"version":3,"file":"CarouselAssets.js","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n const canEditMedia = !disabled && onEditAsset;\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={canEditMedia ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","canEditMedia","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":"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"}
@@ -12,6 +12,7 @@ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = fals
12
12
  const { formatMessage } = useIntl();
13
13
  const [isEditingAsset, setIsEditingAsset] = React.useState(false);
14
14
  const currentAsset = assets[selectedAssetIndex];
15
+ const canEditMedia = !disabled && onEditAsset;
15
16
  return /*#__PURE__*/ jsxs(Fragment, {
16
17
  children: [
17
18
  /*#__PURE__*/ jsx(CarouselInput, {
@@ -37,7 +38,7 @@ const CarouselAssets = /*#__PURE__*/ React.forwardRef(({ assets, disabled = fals
37
38
  asset: currentAsset,
38
39
  onDeleteAsset: disabled ? undefined : onDeleteAsset,
39
40
  onAddAsset: disabled ? undefined : onAddAsset,
40
- onEditAsset: onEditAsset ? ()=>setIsEditingAsset(true) : undefined
41
+ onEditAsset: canEditMedia ? ()=>setIsEditingAsset(true) : undefined
41
42
  }) : undefined,
42
43
  children: assets.length === 0 ? /*#__PURE__*/ jsx(CarouselSlide, {
43
44
  label: formatMessage({
@@ -1 +1 @@
1
- {"version":3,"file":"CarouselAssets.mjs","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={onEditAsset ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":"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"}
1
+ {"version":3,"file":"CarouselAssets.mjs","sources":["../../../../../admin/src/components/MediaLibraryInput/Carousel/CarouselAssets.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { CarouselInput, CarouselSlide } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../../utils/getTrad';\nimport { EditAssetDialog } from '../../EditAssetDialog/EditAssetContent';\n\nimport { CarouselAsset } from './CarouselAsset';\nimport { CarouselAssetActions } from './CarouselAssetActions';\nimport { EmptyStateAsset } from './EmptyStateAsset';\n\nimport type { File as FileAsset, RawFile } from '../../../../../shared/contracts/files';\n\nexport type FileWithoutIdHash = Omit<FileAsset, 'id' | 'hash'>;\n\ninterface Asset extends Omit<FileAsset, 'folder'> {\n isLocal?: boolean;\n rawFile?: RawFile;\n folder?: FileAsset['folder'] & { id: number };\n}\n\nexport interface CarouselAssetsProps {\n assets: FileAsset[];\n disabled?: boolean;\n error?: string;\n hint?: string;\n label: string;\n labelAction?: React.ReactNode;\n onAddAsset: (asset?: FileAsset, event?: React.MouseEventHandler<HTMLButtonElement>) => void;\n onDeleteAsset: (asset: FileAsset) => void;\n onDeleteAssetFromMediaLibrary: () => void;\n onDropAsset?: (assets: FileWithoutIdHash[]) => void;\n onEditAsset?: (asset: FileAsset) => void;\n onNext: () => void;\n onPrevious: () => void;\n required?: boolean;\n selectedAssetIndex: number;\n trackedLocation?: string;\n}\n\nexport const CarouselAssets = React.forwardRef(\n (\n {\n assets,\n disabled = false,\n error,\n hint,\n label,\n labelAction,\n onAddAsset,\n onDeleteAsset,\n onDeleteAssetFromMediaLibrary,\n onDropAsset,\n onEditAsset,\n onNext,\n onPrevious,\n required = false,\n selectedAssetIndex,\n trackedLocation,\n }: CarouselAssetsProps,\n forwardedRef\n ) => {\n const { formatMessage } = useIntl();\n const [isEditingAsset, setIsEditingAsset] = React.useState(false);\n\n const currentAsset = assets[selectedAssetIndex];\n const canEditMedia = !disabled && onEditAsset;\n\n return (\n <>\n <CarouselInput\n ref={forwardedRef as React.Ref<HTMLDivElement>}\n label={label}\n labelAction={labelAction}\n secondaryLabel={currentAsset?.name}\n selectedSlide={selectedAssetIndex}\n previousLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.previousSlide'),\n defaultMessage: 'Previous slide',\n })}\n nextLabel={formatMessage({\n id: getTrad('mediaLibraryInput.actions.nextSlide'),\n defaultMessage: 'Next slide',\n })}\n onNext={onNext}\n onPrevious={onPrevious}\n hint={hint}\n error={error}\n required={required}\n actions={\n currentAsset ? (\n <CarouselAssetActions\n asset={currentAsset}\n onDeleteAsset={disabled ? undefined : onDeleteAsset}\n onAddAsset={disabled ? undefined : onAddAsset}\n onEditAsset={canEditMedia ? () => setIsEditingAsset(true) : undefined}\n />\n ) : undefined\n }\n >\n {assets.length === 0 ? (\n <CarouselSlide\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: 1, m: 1 }\n )}\n >\n <EmptyStateAsset\n disabled={disabled}\n onClick={onAddAsset}\n onDropAsset={onDropAsset!}\n />\n </CarouselSlide>\n ) : (\n assets.map((asset, index) => (\n <CarouselSlide\n key={asset.id}\n label={formatMessage(\n {\n id: getTrad('mediaLibraryInput.slideCount'),\n defaultMessage: '{n} of {m} slides',\n },\n { n: index + 1, m: assets.length }\n )}\n >\n <CarouselAsset asset={asset} />\n </CarouselSlide>\n ))\n )}\n </CarouselInput>\n <EditAssetDialog\n open={isEditingAsset}\n onClose={(editedAsset) => {\n setIsEditingAsset(false);\n\n // The asset has been deleted\n if (editedAsset === null) {\n onDeleteAssetFromMediaLibrary();\n }\n if (editedAsset && typeof editedAsset !== 'boolean') {\n onEditAsset?.(editedAsset);\n }\n }}\n asset={currentAsset as Asset}\n canUpdate\n canCopyLink\n canDownload\n trackedLocation={trackedLocation}\n />\n </>\n );\n }\n);\n"],"names":["CarouselAssets","React","forwardRef","assets","disabled","error","hint","label","labelAction","onAddAsset","onDeleteAsset","onDeleteAssetFromMediaLibrary","onDropAsset","onEditAsset","onNext","onPrevious","required","selectedAssetIndex","trackedLocation","forwardedRef","formatMessage","useIntl","isEditingAsset","setIsEditingAsset","useState","currentAsset","canEditMedia","_jsxs","_Fragment","_jsx","CarouselInput","ref","secondaryLabel","name","selectedSlide","previousLabel","id","getTrad","defaultMessage","nextLabel","actions","CarouselAssetActions","asset","undefined","length","CarouselSlide","n","m","EmptyStateAsset","onClick","map","index","CarouselAsset","EditAssetDialog","open","onClose","editedAsset","canUpdate","canCopyLink","canDownload"],"mappings":"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"}
@@ -1,18 +1,23 @@
1
1
  'use strict';
2
2
 
3
- function flattenTree(tree, parent = null, depth = 0) {
4
- return tree.flatMap((item)=>item.children ? [
3
+ function flattenTree(tree, parent = null, depth = 0, path = '') {
4
+ return tree.flatMap((item)=>{
5
+ const newPath = item.value ? `${path}/${item.value}` : path;
6
+ return item.children ? [
5
7
  {
6
8
  ...item,
7
9
  parent: parent?.value,
8
- depth
10
+ depth,
11
+ path: newPath
9
12
  },
10
- ...flattenTree(item.children, item, depth + 1)
13
+ ...flattenTree(item.children, item, depth + 1, newPath)
11
14
  ] : {
12
15
  ...item,
13
16
  depth,
14
- parent: parent?.value
15
- });
17
+ parent: parent?.value,
18
+ path: newPath
19
+ };
20
+ });
16
21
  }
17
22
 
18
23
  exports.flattenTree = flattenTree;
@@ -1 +1 @@
1
- {"version":3,"file":"flattenTree.js","sources":["../../../../../admin/src/components/SelectTree/utils/flattenTree.ts"],"sourcesContent":["type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n children?: TreeNode<T>[];\n};\n\nexport function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0\n): FlattenedNode<T>[] {\n return tree.flatMap((item) =>\n item.children\n ? [{ ...item, parent: parent?.value, depth }, ...flattenTree(item.children, item, depth + 1)]\n : { ...item, depth, parent: parent?.value }\n );\n}\n"],"names":["flattenTree","tree","parent","depth","flatMap","item","children","value"],"mappings":";;AAeO,SAASA,YACdC,IAAmB,EACnBC,SAA6B,IAAI,EACjCC,QAAgB,CAAC,EAAA;AAEjB,IAAA,OAAOF,KAAKG,OAAO,CAAC,CAACC,IACnBA,GAAAA,IAAAA,CAAKC,QAAQ,GACT;AAAC,YAAA;AAAE,gBAAA,GAAGD,IAAI;AAAEH,gBAAAA,MAAAA,EAAQA,MAAQK,EAAAA,KAAAA;AAAOJ,gBAAAA;AAAM,aAAA;AAAMH,YAAAA,GAAAA,WAAAA,CAAYK,IAAKC,CAAAA,QAAQ,EAAED,IAAAA,EAAMF,KAAQ,GAAA,CAAA;SAAG,GAC3F;AAAE,YAAA,GAAGE,IAAI;AAAEF,YAAAA,KAAAA;AAAOD,YAAAA,MAAAA,EAAQA,MAAQK,EAAAA;AAAM,SAAA,CAAA;AAEhD;;;;"}
1
+ {"version":3,"file":"flattenTree.js","sources":["../../../../../admin/src/components/SelectTree/utils/flattenTree.ts"],"sourcesContent":["type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n path?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n path?: string;\n children?: TreeNode<T>[];\n};\n\nexport function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0,\n path: string = ''\n): FlattenedNode<T>[] {\n return tree.flatMap((item) => {\n const newPath = item.value ? `${path}/${item.value}` : path;\n\n return item.children\n ? [\n { ...item, parent: parent?.value, depth, path: newPath },\n ...flattenTree(item.children, item, depth + 1, newPath),\n ]\n : { ...item, depth, parent: parent?.value, path: newPath };\n });\n}\n"],"names":["flattenTree","tree","parent","depth","path","flatMap","item","newPath","value","children"],"mappings":";;AAiBO,SAASA,WACdC,CAAAA,IAAmB,EACnBC,MAAAA,GAA6B,IAAI,EACjCC,KAAgB,GAAA,CAAC,EACjBC,IAAAA,GAAe,EAAE,EAAA;IAEjB,OAAOH,IAAAA,CAAKI,OAAO,CAAC,CAACC,IAAAA,GAAAA;AACnB,QAAA,MAAMC,OAAUD,GAAAA,IAAAA,CAAKE,KAAK,GAAG,CAAC,EAAEJ,IAAK,CAAA,CAAC,EAAEE,IAAAA,CAAKE,KAAK,CAAC,CAAC,GAAGJ,IAAAA;QAEvD,OAAOE,IAAAA,CAAKG,QAAQ,GAChB;AACE,YAAA;AAAE,gBAAA,GAAGH,IAAI;AAAEJ,gBAAAA,MAAAA,EAAQA,MAAQM,EAAAA,KAAAA;AAAOL,gBAAAA,KAAAA;gBAAOC,IAAMG,EAAAA;AAAQ,aAAA;AACpDP,YAAAA,GAAAA,WAAAA,CAAYM,IAAKG,CAAAA,QAAQ,EAAEH,IAAAA,EAAMH,QAAQ,CAAGI,EAAAA,OAAAA;SAChD,GACD;AAAE,YAAA,GAAGD,IAAI;AAAEH,YAAAA,KAAAA;AAAOD,YAAAA,MAAAA,EAAQA,MAAQM,EAAAA,KAAAA;YAAOJ,IAAMG,EAAAA;AAAQ,SAAA;AAC7D,KAAA,CAAA;AACF;;;;"}
@@ -1,16 +1,21 @@
1
- function flattenTree(tree, parent = null, depth = 0) {
2
- return tree.flatMap((item)=>item.children ? [
1
+ function flattenTree(tree, parent = null, depth = 0, path = '') {
2
+ return tree.flatMap((item)=>{
3
+ const newPath = item.value ? `${path}/${item.value}` : path;
4
+ return item.children ? [
3
5
  {
4
6
  ...item,
5
7
  parent: parent?.value,
6
- depth
8
+ depth,
9
+ path: newPath
7
10
  },
8
- ...flattenTree(item.children, item, depth + 1)
11
+ ...flattenTree(item.children, item, depth + 1, newPath)
9
12
  ] : {
10
13
  ...item,
11
14
  depth,
12
- parent: parent?.value
13
- });
15
+ parent: parent?.value,
16
+ path: newPath
17
+ };
18
+ });
14
19
  }
15
20
 
16
21
  export { flattenTree };
@@ -1 +1 @@
1
- {"version":3,"file":"flattenTree.mjs","sources":["../../../../../admin/src/components/SelectTree/utils/flattenTree.ts"],"sourcesContent":["type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n children?: TreeNode<T>[];\n};\n\nexport function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0\n): FlattenedNode<T>[] {\n return tree.flatMap((item) =>\n item.children\n ? [{ ...item, parent: parent?.value, depth }, ...flattenTree(item.children, item, depth + 1)]\n : { ...item, depth, parent: parent?.value }\n );\n}\n"],"names":["flattenTree","tree","parent","depth","flatMap","item","children","value"],"mappings":"AAeO,SAASA,YACdC,IAAmB,EACnBC,SAA6B,IAAI,EACjCC,QAAgB,CAAC,EAAA;AAEjB,IAAA,OAAOF,KAAKG,OAAO,CAAC,CAACC,IACnBA,GAAAA,IAAAA,CAAKC,QAAQ,GACT;AAAC,YAAA;AAAE,gBAAA,GAAGD,IAAI;AAAEH,gBAAAA,MAAAA,EAAQA,MAAQK,EAAAA,KAAAA;AAAOJ,gBAAAA;AAAM,aAAA;AAAMH,YAAAA,GAAAA,WAAAA,CAAYK,IAAKC,CAAAA,QAAQ,EAAED,IAAAA,EAAMF,KAAQ,GAAA,CAAA;SAAG,GAC3F;AAAE,YAAA,GAAGE,IAAI;AAAEF,YAAAA,KAAAA;AAAOD,YAAAA,MAAAA,EAAQA,MAAQK,EAAAA;AAAM,SAAA,CAAA;AAEhD;;;;"}
1
+ {"version":3,"file":"flattenTree.mjs","sources":["../../../../../admin/src/components/SelectTree/utils/flattenTree.ts"],"sourcesContent":["type TreeNode<T> = {\n value: T;\n children?: TreeNode<T>[];\n label?: string;\n path?: string;\n};\n\nexport type FlattenedNode<T> = {\n value: T;\n parent?: T;\n depth: number;\n // we need the label in places where flattenTree is used\n label?: string;\n path?: string;\n children?: TreeNode<T>[];\n};\n\nexport function flattenTree<T>(\n tree: TreeNode<T>[],\n parent: TreeNode<T> | null = null,\n depth: number = 0,\n path: string = ''\n): FlattenedNode<T>[] {\n return tree.flatMap((item) => {\n const newPath = item.value ? `${path}/${item.value}` : path;\n\n return item.children\n ? [\n { ...item, parent: parent?.value, depth, path: newPath },\n ...flattenTree(item.children, item, depth + 1, newPath),\n ]\n : { ...item, depth, parent: parent?.value, path: newPath };\n });\n}\n"],"names":["flattenTree","tree","parent","depth","path","flatMap","item","newPath","value","children"],"mappings":"AAiBO,SAASA,WACdC,CAAAA,IAAmB,EACnBC,MAAAA,GAA6B,IAAI,EACjCC,KAAgB,GAAA,CAAC,EACjBC,IAAAA,GAAe,EAAE,EAAA;IAEjB,OAAOH,IAAAA,CAAKI,OAAO,CAAC,CAACC,IAAAA,GAAAA;AACnB,QAAA,MAAMC,OAAUD,GAAAA,IAAAA,CAAKE,KAAK,GAAG,CAAC,EAAEJ,IAAK,CAAA,CAAC,EAAEE,IAAAA,CAAKE,KAAK,CAAC,CAAC,GAAGJ,IAAAA;QAEvD,OAAOE,IAAAA,CAAKG,QAAQ,GAChB;AACE,YAAA;AAAE,gBAAA,GAAGH,IAAI;AAAEJ,gBAAAA,MAAAA,EAAQA,MAAQM,EAAAA,KAAAA;AAAOL,gBAAAA,KAAAA;gBAAOC,IAAMG,EAAAA;AAAQ,aAAA;AACpDP,YAAAA,GAAAA,WAAAA,CAAYM,IAAKG,CAAAA,QAAQ,EAAEH,IAAAA,EAAMH,QAAQ,CAAGI,EAAAA,OAAAA;SAChD,GACD;AAAE,YAAA,GAAGD,IAAI;AAAEH,YAAAA,KAAAA;AAAOD,YAAAA,MAAAA,EAAQA,MAAQM,EAAAA,KAAAA;YAAOJ,IAAMG,EAAAA;AAAQ,SAAA;AAC7D,KAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var ee = require('@strapi/admin/strapi-admin/ee');
4
+ var useSettings = require('./useSettings.js');
5
+
6
+ const useAIAvailability = ()=>{
7
+ const isAiAvailable = ee.useAIAvailability();
8
+ const { status, data } = useSettings.useSettings(isAiAvailable);
9
+ if (!isAiAvailable) {
10
+ return {
11
+ status: 'success',
12
+ isEnabled: false
13
+ };
14
+ }
15
+ return {
16
+ status,
17
+ isEnabled: data?.aiMetadata
18
+ };
19
+ };
20
+
21
+ exports.useAIAvailability = useAIAvailability;
22
+ //# sourceMappingURL=useAiAvailability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAiAvailability.js","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;;;MAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,aAAgBC,GAAAA,oBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,uBAAYJ,CAAAA,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAe,EAAA;QAClB,OAAO;YAAEE,MAAQ,EAAA,SAAA;YAAoBG,SAAW,EAAA;AAAM,SAAA;AACxD;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAMG,EAAAA;AAAW,KAAA;AAC/C;;;;"}
@@ -0,0 +1,20 @@
1
+ import { useAIAvailability as useAIAvailability$1 } from '@strapi/admin/strapi-admin/ee';
2
+ import { useSettings } from './useSettings.mjs';
3
+
4
+ const useAIAvailability = ()=>{
5
+ const isAiAvailable = useAIAvailability$1();
6
+ const { status, data } = useSettings(isAiAvailable);
7
+ if (!isAiAvailable) {
8
+ return {
9
+ status: 'success',
10
+ isEnabled: false
11
+ };
12
+ }
13
+ return {
14
+ status,
15
+ isEnabled: data?.aiMetadata
16
+ };
17
+ };
18
+
19
+ export { useAIAvailability };
20
+ //# sourceMappingURL=useAiAvailability.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAiAvailability.mjs","sources":["../../../admin/src/hooks/useAiAvailability.ts"],"sourcesContent":["import { useAIAvailability as useGlobalAIAvailability } from '@strapi/admin/strapi-admin/ee';\n\nimport { useSettings } from './useSettings';\n\nexport const useAIAvailability = () => {\n const isAiAvailable = useGlobalAIAvailability();\n const { status, data } = useSettings(isAiAvailable);\n\n if (!isAiAvailable) {\n return { status: 'success' as const, isEnabled: false };\n }\n\n return { status, isEnabled: data?.aiMetadata };\n};\n"],"names":["useAIAvailability","isAiAvailable","useGlobalAIAvailability","status","data","useSettings","isEnabled","aiMetadata"],"mappings":";;;MAIaA,iBAAoB,GAAA,IAAA;AAC/B,IAAA,MAAMC,aAAgBC,GAAAA,mBAAAA,EAAAA;AACtB,IAAA,MAAM,EAAEC,MAAM,EAAEC,IAAI,EAAE,GAAGC,WAAYJ,CAAAA,aAAAA,CAAAA;AAErC,IAAA,IAAI,CAACA,aAAe,EAAA;QAClB,OAAO;YAAEE,MAAQ,EAAA,SAAA;YAAoBG,SAAW,EAAA;AAAM,SAAA;AACxD;IAEA,OAAO;AAAEH,QAAAA,MAAAA;AAAQG,QAAAA,SAAAA,EAAWF,IAAMG,EAAAA;AAAW,KAAA;AAC/C;;;;"}
@@ -0,0 +1,66 @@
1
+ 'use strict';
2
+
3
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
4
+ var reactIntl = require('react-intl');
5
+ var reactQuery = require('react-query');
6
+ var pluginId = require('../pluginId.js');
7
+ require('byte-size');
8
+ require('date-fns');
9
+ var getTrad = require('../utils/getTrad.js');
10
+ require('qs');
11
+ require('../constants.js');
12
+ require('../utils/urlYupSchema.js');
13
+
14
+ const useBulkEdit = ()=>{
15
+ const { formatMessage } = reactIntl.useIntl();
16
+ const { toggleNotification } = strapiAdmin.useNotification();
17
+ const queryClient = reactQuery.useQueryClient();
18
+ const { post } = strapiAdmin.useFetchClient();
19
+ const bulkEditQuery = ({ updates })=>{
20
+ return post('/upload/actions/bulk-update', {
21
+ updates
22
+ });
23
+ };
24
+ const mutation = reactQuery.useMutation(bulkEditQuery, {
25
+ onSuccess (res) {
26
+ const { data } = res;
27
+ if (data && data.length > 0) {
28
+ queryClient.refetchQueries([
29
+ pluginId.pluginId,
30
+ 'assets'
31
+ ], {
32
+ active: true
33
+ });
34
+ queryClient.refetchQueries([
35
+ pluginId.pluginId,
36
+ 'asset-count'
37
+ ], {
38
+ active: true
39
+ });
40
+ queryClient.refetchQueries([
41
+ pluginId.pluginId,
42
+ 'folders'
43
+ ], {
44
+ active: true
45
+ });
46
+ }
47
+ toggleNotification({
48
+ type: 'success',
49
+ message: formatMessage({
50
+ id: getTrad.getTrad('modal.edit.success-label'),
51
+ defaultMessage: 'Files have been successfully updated.'
52
+ })
53
+ });
54
+ }
55
+ });
56
+ const edit = (updates)=>mutation.mutateAsync({
57
+ updates
58
+ });
59
+ return {
60
+ ...mutation,
61
+ edit
62
+ };
63
+ };
64
+
65
+ exports.useBulkEdit = useBulkEdit;
66
+ //# sourceMappingURL=useBulkEdit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBulkEdit.js","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;;;MAsBaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,2BAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAcC,GAAAA,yBAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAgB,GAAA,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAA+B,EAAA;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,KAAA;IAEA,MAAMC,QAAAA,GAAWC,uBAIfH,aAAe,EAAA;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAQA,IAAAA,IAAAA,CAAKC,MAAM,GAAG,CAAG,EAAA;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,iBAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACnE;YAEAhB,kBAAmB,CAAA;gBACjBiB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAc,CAAA;AACrBqB,oBAAAA,EAAAA,EAAIC,eAAQ,CAAA,0BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAO,GAAA,CACXf,OAIGC,GAAAA,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}
@@ -0,0 +1,64 @@
1
+ import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';
2
+ import { useIntl } from 'react-intl';
3
+ import { useQueryClient, useMutation } from 'react-query';
4
+ import { pluginId } from '../pluginId.mjs';
5
+ import 'byte-size';
6
+ import 'date-fns';
7
+ import { getTrad } from '../utils/getTrad.mjs';
8
+ import 'qs';
9
+ import '../constants.mjs';
10
+ import '../utils/urlYupSchema.mjs';
11
+
12
+ const useBulkEdit = ()=>{
13
+ const { formatMessage } = useIntl();
14
+ const { toggleNotification } = useNotification();
15
+ const queryClient = useQueryClient();
16
+ const { post } = useFetchClient();
17
+ const bulkEditQuery = ({ updates })=>{
18
+ return post('/upload/actions/bulk-update', {
19
+ updates
20
+ });
21
+ };
22
+ const mutation = useMutation(bulkEditQuery, {
23
+ onSuccess (res) {
24
+ const { data } = res;
25
+ if (data && data.length > 0) {
26
+ queryClient.refetchQueries([
27
+ pluginId,
28
+ 'assets'
29
+ ], {
30
+ active: true
31
+ });
32
+ queryClient.refetchQueries([
33
+ pluginId,
34
+ 'asset-count'
35
+ ], {
36
+ active: true
37
+ });
38
+ queryClient.refetchQueries([
39
+ pluginId,
40
+ 'folders'
41
+ ], {
42
+ active: true
43
+ });
44
+ }
45
+ toggleNotification({
46
+ type: 'success',
47
+ message: formatMessage({
48
+ id: getTrad('modal.edit.success-label'),
49
+ defaultMessage: 'Files have been successfully updated.'
50
+ })
51
+ });
52
+ }
53
+ });
54
+ const edit = (updates)=>mutation.mutateAsync({
55
+ updates
56
+ });
57
+ return {
58
+ ...mutation,
59
+ edit
60
+ };
61
+ };
62
+
63
+ export { useBulkEdit };
64
+ //# sourceMappingURL=useBulkEdit.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBulkEdit.mjs","sources":["../../../admin/src/hooks/useBulkEdit.ts"],"sourcesContent":["import { useNotification, useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQueryClient } from 'react-query';\n\nimport { BulkUpdateFiles } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\nimport { getTrad } from '../utils';\n\ninterface FileInfoUpdate {\n name: string;\n alternativeText: string | null;\n caption: string | null;\n folder: number | null;\n}\n\ninterface BulkEditParams {\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>;\n}\n\nexport const useBulkEdit = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const queryClient = useQueryClient();\n const { post } = useFetchClient();\n\n const bulkEditQuery = ({ updates }: BulkEditParams) => {\n return post('/upload/actions/bulk-update', { updates });\n };\n\n const mutation = useMutation<\n BulkUpdateFiles.Response,\n BulkUpdateFiles.Response['error'],\n BulkEditParams\n >(bulkEditQuery, {\n onSuccess(res) {\n const { data } = res;\n\n if (data && data.length > 0) {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n queryClient.refetchQueries([pluginId, 'folders'], { active: true });\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: getTrad('modal.edit.success-label'),\n defaultMessage: 'Files have been successfully updated.',\n }),\n });\n },\n });\n\n const edit = (\n updates: Array<{\n id: number;\n fileInfo: FileInfoUpdate;\n }>\n ) => mutation.mutateAsync({ updates });\n\n return { ...mutation, edit };\n};\n"],"names":["useBulkEdit","formatMessage","useIntl","toggleNotification","useNotification","queryClient","useQueryClient","post","useFetchClient","bulkEditQuery","updates","mutation","useMutation","onSuccess","res","data","length","refetchQueries","pluginId","active","type","message","id","getTrad","defaultMessage","edit","mutateAsync"],"mappings":";;;;;;;;;;;MAsBaA,WAAc,GAAA,IAAA;IACzB,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAMC,WAAcC,GAAAA,cAAAA,EAAAA;IACpB,MAAM,EAAEC,IAAI,EAAE,GAAGC,cAAAA,EAAAA;AAEjB,IAAA,MAAMC,aAAgB,GAAA,CAAC,EAAEC,OAAO,EAAkB,GAAA;AAChD,QAAA,OAAOH,KAAK,6BAA+B,EAAA;AAAEG,YAAAA;AAAQ,SAAA,CAAA;AACvD,KAAA;IAEA,MAAMC,QAAAA,GAAWC,YAIfH,aAAe,EAAA;AACfI,QAAAA,SAAAA,CAAAA,CAAUC,GAAG,EAAA;YACX,MAAM,EAAEC,IAAI,EAAE,GAAGD,GAAAA;AAEjB,YAAA,IAAIC,IAAQA,IAAAA,IAAAA,CAAKC,MAAM,GAAG,CAAG,EAAA;AAC3BX,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAS,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AAChEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAc,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACrEd,gBAAAA,WAAAA,CAAYY,cAAc,CAAC;AAACC,oBAAAA,QAAAA;AAAU,oBAAA;iBAAU,EAAE;oBAAEC,MAAQ,EAAA;AAAK,iBAAA,CAAA;AACnE;YAEAhB,kBAAmB,CAAA;gBACjBiB,IAAM,EAAA,SAAA;AACNC,gBAAAA,OAAAA,EAASpB,aAAc,CAAA;AACrBqB,oBAAAA,EAAAA,EAAIC,OAAQ,CAAA,0BAAA,CAAA;oBACZC,cAAgB,EAAA;AAClB,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA,CAAA;AAEA,IAAA,MAAMC,IAAO,GAAA,CACXf,OAIGC,GAAAA,QAAAA,CAASe,WAAW,CAAC;AAAEhB,YAAAA;AAAQ,SAAA,CAAA;IAEpC,OAAO;AAAE,QAAA,GAAGC,QAAQ;AAAEc,QAAAA;AAAK,KAAA;AAC7B;;;;"}
@@ -0,0 +1,22 @@
1
+ 'use strict';
2
+
3
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
4
+ var reactQuery = require('react-query');
5
+
6
+ function useSettings(isEnabled = true) {
7
+ const { get } = strapiAdmin.useFetchClient();
8
+ return reactQuery.useQuery({
9
+ queryKey: [
10
+ 'upload',
11
+ 'settings'
12
+ ],
13
+ enabled: isEnabled,
14
+ async queryFn () {
15
+ const { data: { data } } = await get('/upload/settings');
16
+ return data;
17
+ }
18
+ });
19
+ }
20
+
21
+ exports.useSettings = useSettings;
22
+ //# sourceMappingURL=useSettings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSettings.js","sources":["../../../admin/src/hooks/useSettings.ts"],"sourcesContent":["import { useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useQuery } from 'react-query';\n\nimport type { GetSettings } from '../../../shared/contracts/settings';\n\nexport function useSettings(isEnabled: boolean = true) {\n const { get } = useFetchClient();\n\n return useQuery({\n queryKey: ['upload', 'settings'],\n enabled: isEnabled,\n async queryFn() {\n const {\n data: { data },\n } = await get<GetSettings.Response['data']>('/upload/settings');\n\n return data;\n },\n });\n}\n"],"names":["useSettings","isEnabled","get","useFetchClient","useQuery","queryKey","enabled","queryFn","data"],"mappings":";;;;;AAKO,SAASA,WAAYC,CAAAA,SAAAA,GAAqB,IAAI,EAAA;IACnD,MAAM,EAAEC,GAAG,EAAE,GAAGC,0BAAAA,EAAAA;AAEhB,IAAA,OAAOC,mBAAS,CAAA;QACdC,QAAU,EAAA;AAAC,YAAA,QAAA;AAAU,YAAA;AAAW,SAAA;QAChCC,OAASL,EAAAA,SAAAA;QACT,MAAMM,OAAAA,CAAAA,GAAAA;YACJ,MAAM,EACJC,MAAM,EAAEA,IAAI,EAAE,EACf,GAAG,MAAMN,GAAkC,CAAA,kBAAA,CAAA;YAE5C,OAAOM,IAAAA;AACT;AACF,KAAA,CAAA;AACF;;;;"}
@@ -0,0 +1,20 @@
1
+ import { useFetchClient } from '@strapi/admin/strapi-admin';
2
+ import { useQuery } from 'react-query';
3
+
4
+ function useSettings(isEnabled = true) {
5
+ const { get } = useFetchClient();
6
+ return useQuery({
7
+ queryKey: [
8
+ 'upload',
9
+ 'settings'
10
+ ],
11
+ enabled: isEnabled,
12
+ async queryFn () {
13
+ const { data: { data } } = await get('/upload/settings');
14
+ return data;
15
+ }
16
+ });
17
+ }
18
+
19
+ export { useSettings };
20
+ //# sourceMappingURL=useSettings.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSettings.mjs","sources":["../../../admin/src/hooks/useSettings.ts"],"sourcesContent":["import { useFetchClient } from '@strapi/admin/strapi-admin';\nimport { useQuery } from 'react-query';\n\nimport type { GetSettings } from '../../../shared/contracts/settings';\n\nexport function useSettings(isEnabled: boolean = true) {\n const { get } = useFetchClient();\n\n return useQuery({\n queryKey: ['upload', 'settings'],\n enabled: isEnabled,\n async queryFn() {\n const {\n data: { data },\n } = await get<GetSettings.Response['data']>('/upload/settings');\n\n return data;\n },\n });\n}\n"],"names":["useSettings","isEnabled","get","useFetchClient","useQuery","queryKey","enabled","queryFn","data"],"mappings":";;;AAKO,SAASA,WAAYC,CAAAA,SAAAA,GAAqB,IAAI,EAAA;IACnD,MAAM,EAAEC,GAAG,EAAE,GAAGC,cAAAA,EAAAA;AAEhB,IAAA,OAAOC,QAAS,CAAA;QACdC,QAAU,EAAA;AAAC,YAAA,QAAA;AAAU,YAAA;AAAW,SAAA;QAChCC,OAASL,EAAAA,SAAAA;QACT,MAAMM,OAAAA,CAAAA,GAAAA;YACJ,MAAM,EACJC,MAAM,EAAEA,IAAI,EAAE,EACf,GAAG,MAAMN,GAAkC,CAAA,kBAAA,CAAA;YAE5C,OAAOM,IAAAA;AACT;AACF,KAAA,CAAA;AACF;;;;"}
@@ -26,16 +26,26 @@ function _interopNamespaceDefault(e) {
26
26
  var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
27
27
 
28
28
  const endpoint = `/${pluginId.pluginId}`;
29
- const uploadAsset = (asset, folderId, signal, onProgress, post)=>{
30
- const { rawFile, caption, name, alternativeText } = asset;
29
+ const uploadAssets = (assets, folderId, signal, onProgress, post)=>{
30
+ const assetsArray = Array.isArray(assets) ? assets : [
31
+ assets
32
+ ];
31
33
  const formData = new FormData();
32
- formData.append('files', rawFile);
33
- formData.append('fileInfo', JSON.stringify({
34
- name,
35
- caption,
36
- alternativeText,
37
- folder: folderId
38
- }));
34
+ // Add all files to the form data
35
+ assetsArray.forEach((asset)=>{
36
+ if (asset.rawFile) {
37
+ formData.append('files', asset.rawFile);
38
+ }
39
+ });
40
+ // Add each fileInfo as a separate stringified field
41
+ assetsArray.forEach((asset)=>{
42
+ formData.append('fileInfo', JSON.stringify({
43
+ name: asset.name,
44
+ caption: asset.caption,
45
+ alternativeText: asset.alternativeText,
46
+ folder: folderId
47
+ }));
48
+ });
39
49
  /**
40
50
  * onProgress is not possible using native fetch
41
51
  * need to look into an alternative to make it work
@@ -51,8 +61,8 @@ const useUpload = ()=>{
51
61
  const abortController = new AbortController();
52
62
  const signal = abortController.signal;
53
63
  const { post } = strapiAdmin.useFetchClient();
54
- const mutation = reactQuery.useMutation(({ asset, folderId })=>{
55
- return uploadAsset(asset, folderId, signal, setProgress, post);
64
+ const mutation = reactQuery.useMutation(({ assets, folderId })=>{
65
+ return uploadAssets(assets, folderId, signal, setProgress, post);
56
66
  }, {
57
67
  onSuccess () {
58
68
  queryClient.refetchQueries([
@@ -68,12 +78,13 @@ const useUpload = ()=>{
68
78
  active: true
69
79
  });
70
80
  dispatch(strapiAdmin.adminApi.util.invalidateTags([
71
- 'HomepageKeyStatistics'
81
+ 'HomepageKeyStatistics',
82
+ 'AIUsage'
72
83
  ]));
73
84
  }
74
85
  });
75
- const upload = (asset, folderId)=>mutation.mutateAsync({
76
- asset,
86
+ const upload = (assets, folderId)=>mutation.mutateAsync({
87
+ assets,
77
88
  folderId
78
89
  });
79
90
  const cancel = ()=>abortController.abort();
@@ -1 +1 @@
1
- {"version":3,"file":"useUpload.js","sources":["../../../admin/src/hooks/useUpload.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, FetchClient, adminApi } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { useDispatch } from 'react-redux';\n\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends Omit<File, 'id' | 'hash'> {\n rawFile?: RawFile;\n id?: File['id'];\n hash?: File['hash'];\n}\n\nconst uploadAsset = (\n asset: Asset,\n folderId: number | null,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const { rawFile, caption, name, alternativeText } = asset;\n const formData = new FormData();\n\n formData.append('files', rawFile!);\n\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name,\n caption,\n alternativeText,\n folder: folderId,\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 useUpload = () => {\n const dispatch = useDispatch();\n const [progress, setProgress] = React.useState(0);\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n CreateFile.Response['data'],\n CreateFile.Response['error'],\n { asset: Asset; folderId: number | null }\n >(\n ({ asset, folderId }) => {\n return uploadAsset(asset, folderId, signal, setProgress, post);\n },\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n dispatch(adminApi.util.invalidateTags(['HomepageKeyStatistics']));\n },\n }\n );\n\n const upload = (asset: Asset, folderId: number | null) =>\n mutation.mutateAsync({ asset, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n isLoading: mutation.isLoading,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n"],"names":["endpoint","pluginId","uploadAsset","asset","folderId","signal","onProgress","post","rawFile","caption","name","alternativeText","formData","FormData","append","JSON","stringify","folder","then","res","data","useUpload","dispatch","useDispatch","progress","setProgress","React","useState","queryClient","useQueryClient","abortController","AbortController","useFetchClient","mutation","useMutation","onSuccess","refetchQueries","active","adminApi","util","invalidateTags","upload","mutateAsync","cancel","abort","isLoading","error","status"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AASA,MAAMA,QAAW,GAAA,CAAC,CAAC,EAAEC,kBAAS,CAAC;AAQ/B,MAAMC,WAAc,GAAA,CAClBC,KACAC,EAAAA,QAAAA,EACAC,QACAC,UACAC,EAAAA,IAAAA,GAAAA;IAEA,MAAM,EAAEC,OAAO,EAAEC,OAAO,EAAEC,IAAI,EAAEC,eAAe,EAAE,GAAGR,KAAAA;AACpD,IAAA,MAAMS,WAAW,IAAIC,QAAAA,EAAAA;IAErBD,QAASE,CAAAA,MAAM,CAAC,OAASN,EAAAA,OAAAA,CAAAA;AAEzBI,IAAAA,QAAAA,CAASE,MAAM,CACb,UACAC,EAAAA,IAAAA,CAAKC,SAAS,CAAC;AACbN,QAAAA,IAAAA;AACAD,QAAAA,OAAAA;AACAE,QAAAA,eAAAA;QACAM,MAAQb,EAAAA;AACV,KAAA,CAAA,CAAA;AAGF;;;;MAKA,OAAOG,IAAKP,CAAAA,QAAAA,EAAUY,QAAU,EAAA;AAC9BP,QAAAA;AACF,KAAA,CAAA,CAAGa,IAAI,CAAC,CAACC,GAAAA,GAAQA,IAAIC,IAAI,CAAA;AAC3B,CAAA;MAEaC,SAAY,GAAA,IAAA;AACvB,IAAA,MAAMC,QAAWC,GAAAA,sBAAAA,EAAAA;AACjB,IAAA,MAAM,CAACC,QAAUC,EAAAA,WAAAA,CAAY,GAAGC,gBAAAA,CAAMC,QAAQ,CAAC,CAAA,CAAA;AAC/C,IAAA,MAAMC,WAAcC,GAAAA,yBAAAA,EAAAA;AACpB,IAAA,MAAMC,kBAAkB,IAAIC,eAAAA,EAAAA;IAC5B,MAAM1B,MAAAA,GAASyB,gBAAgBzB,MAAM;IACrC,MAAM,EAAEE,IAAI,EAAE,GAAGyB,0BAAAA,EAAAA;AAEjB,IAAA,MAAMC,WAAWC,sBAKf,CAAA,CAAC,EAAE/B,KAAK,EAAEC,QAAQ,EAAE,GAAA;AAClB,QAAA,OAAOF,WAAYC,CAAAA,KAAAA,EAAOC,QAAUC,EAAAA,MAAAA,EAAQoB,WAAalB,EAAAA,IAAAA,CAAAA;KAE3D,EAAA;AACE4B,QAAAA,SAAAA,CAAAA,GAAAA;AACEP,YAAAA,WAAAA,CAAYQ,cAAc,CAAC;AAACnC,gBAAAA,iBAAAA;AAAU,gBAAA;aAAS,EAAE;gBAAEoC,MAAQ,EAAA;AAAK,aAAA,CAAA;AAChET,YAAAA,WAAAA,CAAYQ,cAAc,CAAC;AAACnC,gBAAAA,iBAAAA;AAAU,gBAAA;aAAc,EAAE;gBAAEoC,MAAQ,EAAA;AAAK,aAAA,CAAA;AACrEf,YAAAA,QAAAA,CAASgB,oBAASC,CAAAA,IAAI,CAACC,cAAc,CAAC;AAAC,gBAAA;AAAwB,aAAA,CAAA,CAAA;AACjE;AACF,KAAA,CAAA;AAGF,IAAA,MAAMC,SAAS,CAACtC,KAAAA,EAAcC,QAC5B6B,GAAAA,QAAAA,CAASS,WAAW,CAAC;AAAEvC,YAAAA,KAAAA;AAAOC,YAAAA;AAAS,SAAA,CAAA;IAEzC,MAAMuC,MAAAA,GAAS,IAAMb,eAAAA,CAAgBc,KAAK,EAAA;IAE1C,OAAO;AACLH,QAAAA,MAAAA;AACAI,QAAAA,SAAAA,EAAWZ,SAASY,SAAS;AAC7BF,QAAAA,MAAAA;AACAG,QAAAA,KAAAA,EAAOb,SAASa,KAAK;AACrBtB,QAAAA,QAAAA;AACAuB,QAAAA,MAAAA,EAAQd,SAASc;AACnB,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"useUpload.js","sources":["../../../admin/src/hooks/useUpload.ts"],"sourcesContent":["import * as React from 'react';\n\nimport { useFetchClient, FetchClient, adminApi } from '@strapi/admin/strapi-admin';\nimport { useMutation, useQueryClient } from 'react-query';\nimport { useDispatch } from 'react-redux';\n\nimport { File, RawFile, CreateFile } from '../../../shared/contracts/files';\nimport { pluginId } from '../pluginId';\n\nconst endpoint = `/${pluginId}`;\n\ninterface Asset extends Omit<File, 'id' | 'hash'> {\n rawFile?: RawFile;\n id?: File['id'];\n hash?: File['hash'];\n}\n\nconst uploadAssets = (\n assets: Asset | Asset[],\n folderId: number | null,\n signal: AbortSignal,\n onProgress: (progress: number) => void,\n post: FetchClient['post']\n) => {\n const assetsArray = Array.isArray(assets) ? assets : [assets];\n const formData = new FormData();\n\n // Add all files to the form data\n assetsArray.forEach((asset) => {\n if (asset.rawFile) {\n formData.append('files', asset.rawFile);\n }\n });\n\n // Add each fileInfo as a separate stringified field\n assetsArray.forEach((asset) => {\n formData.append(\n 'fileInfo',\n JSON.stringify({\n name: asset.name,\n caption: asset.caption,\n alternativeText: asset.alternativeText,\n folder: folderId,\n })\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 useUpload = () => {\n const dispatch = useDispatch();\n const [progress, setProgress] = React.useState(0);\n const queryClient = useQueryClient();\n const abortController = new AbortController();\n const signal = abortController.signal;\n const { post } = useFetchClient();\n\n const mutation = useMutation<\n CreateFile.Response['data'],\n CreateFile.Response['error'],\n { assets: Asset | Asset[]; folderId: number | null }\n >(\n ({ assets, folderId }) => {\n return uploadAssets(assets, folderId, signal, setProgress, post);\n },\n {\n onSuccess() {\n queryClient.refetchQueries([pluginId, 'assets'], { active: true });\n queryClient.refetchQueries([pluginId, 'asset-count'], { active: true });\n dispatch(adminApi.util.invalidateTags(['HomepageKeyStatistics', 'AIUsage']));\n },\n }\n );\n\n const upload = (assets: Asset | Asset[], folderId: number | null) =>\n mutation.mutateAsync({ assets, folderId });\n\n const cancel = () => abortController.abort();\n\n return {\n upload,\n isLoading: mutation.isLoading,\n cancel,\n error: mutation.error,\n progress,\n status: mutation.status,\n };\n};\n"],"names":["endpoint","pluginId","uploadAssets","assets","folderId","signal","onProgress","post","assetsArray","Array","isArray","formData","FormData","forEach","asset","rawFile","append","JSON","stringify","name","caption","alternativeText","folder","then","res","data","useUpload","dispatch","useDispatch","progress","setProgress","React","useState","queryClient","useQueryClient","abortController","AbortController","useFetchClient","mutation","useMutation","onSuccess","refetchQueries","active","adminApi","util","invalidateTags","upload","mutateAsync","cancel","abort","isLoading","error","status"],"mappings":"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"}