@strapi/upload 5.33.4 → 5.34.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 (120) hide show
  1. package/dist/admin/future/App.js +45 -0
  2. package/dist/admin/future/App.js.map +1 -0
  3. package/dist/admin/future/App.mjs +43 -0
  4. package/dist/admin/future/App.mjs.map +1 -0
  5. package/dist/admin/future/pages/AIGenerationPage.js +24 -0
  6. package/dist/admin/future/pages/AIGenerationPage.js.map +1 -0
  7. package/dist/admin/future/pages/AIGenerationPage.mjs +22 -0
  8. package/dist/admin/future/pages/AIGenerationPage.mjs.map +1 -0
  9. package/dist/admin/future/pages/MediaLibraryPage.js +55 -0
  10. package/dist/admin/future/pages/MediaLibraryPage.js.map +1 -0
  11. package/dist/admin/future/pages/MediaLibraryPage.mjs +53 -0
  12. package/dist/admin/future/pages/MediaLibraryPage.mjs.map +1 -0
  13. package/dist/admin/hooks/useAIMetadataJob.js +114 -0
  14. package/dist/admin/hooks/useAIMetadataJob.js.map +1 -0
  15. package/dist/admin/hooks/useAIMetadataJob.mjs +93 -0
  16. package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -0
  17. package/dist/admin/index.js +23 -4
  18. package/dist/admin/index.js.map +1 -1
  19. package/dist/admin/index.mjs +24 -5
  20. package/dist/admin/index.mjs.map +1 -1
  21. package/dist/admin/package.json.js +6 -5
  22. package/dist/admin/package.json.js.map +1 -1
  23. package/dist/admin/package.json.mjs +6 -5
  24. package/dist/admin/package.json.mjs.map +1 -1
  25. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -0
  26. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
  27. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -0
  28. package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
  29. package/dist/admin/pages/App/components/Header.js +3 -0
  30. package/dist/admin/pages/App/components/Header.js.map +1 -1
  31. package/dist/admin/pages/App/components/Header.mjs +3 -0
  32. package/dist/admin/pages/App/components/Header.mjs.map +1 -1
  33. package/dist/admin/pages/SettingsPage/SettingsPage.js +252 -67
  34. package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
  35. package/dist/admin/pages/SettingsPage/SettingsPage.mjs +256 -71
  36. package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
  37. package/dist/admin/src/future/App.d.ts +1 -0
  38. package/dist/admin/src/future/pages/AIGenerationPage.d.ts +1 -0
  39. package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +1 -0
  40. package/dist/admin/src/future/services/api.d.ts +2 -0
  41. package/dist/admin/src/future/services/settings.d.ts +2 -0
  42. package/dist/admin/src/hooks/useAIMetadataJob.d.ts +9 -0
  43. package/dist/admin/translations/de.json.js +44 -1
  44. package/dist/admin/translations/de.json.js.map +1 -1
  45. package/dist/admin/translations/de.json.mjs +44 -1
  46. package/dist/admin/translations/de.json.mjs.map +1 -1
  47. package/dist/admin/translations/en.json.js +9 -0
  48. package/dist/admin/translations/en.json.js.map +1 -1
  49. package/dist/admin/translations/en.json.mjs +9 -0
  50. package/dist/admin/translations/en.json.mjs.map +1 -1
  51. package/dist/server/bootstrap.js +1 -0
  52. package/dist/server/bootstrap.js.map +1 -1
  53. package/dist/server/bootstrap.mjs +1 -0
  54. package/dist/server/bootstrap.mjs.map +1 -1
  55. package/dist/server/controllers/admin-file.js +86 -0
  56. package/dist/server/controllers/admin-file.js.map +1 -1
  57. package/dist/server/controllers/admin-file.mjs +86 -0
  58. package/dist/server/controllers/admin-file.mjs.map +1 -1
  59. package/dist/server/controllers/admin-upload.js +3 -23
  60. package/dist/server/controllers/admin-upload.js.map +1 -1
  61. package/dist/server/controllers/admin-upload.mjs +3 -23
  62. package/dist/server/controllers/admin-upload.mjs.map +1 -1
  63. package/dist/server/models/ai-metadata-job.js +36 -0
  64. package/dist/server/models/ai-metadata-job.js.map +1 -0
  65. package/dist/server/models/ai-metadata-job.mjs +33 -0
  66. package/dist/server/models/ai-metadata-job.mjs.map +1 -0
  67. package/dist/server/register.js +3 -0
  68. package/dist/server/register.js.map +1 -1
  69. package/dist/server/register.mjs +3 -0
  70. package/dist/server/register.mjs.map +1 -1
  71. package/dist/server/routes/admin.js +46 -0
  72. package/dist/server/routes/admin.js.map +1 -1
  73. package/dist/server/routes/admin.mjs +46 -0
  74. package/dist/server/routes/admin.mjs.map +1 -1
  75. package/dist/server/services/ai-metadata-jobs.js +72 -0
  76. package/dist/server/services/ai-metadata-jobs.js.map +1 -0
  77. package/dist/server/services/ai-metadata-jobs.mjs +70 -0
  78. package/dist/server/services/ai-metadata-jobs.mjs.map +1 -0
  79. package/dist/server/services/ai-metadata.js +170 -20
  80. package/dist/server/services/ai-metadata.js.map +1 -1
  81. package/dist/server/services/ai-metadata.mjs +170 -20
  82. package/dist/server/services/ai-metadata.mjs.map +1 -1
  83. package/dist/server/services/index.js +3 -1
  84. package/dist/server/services/index.js.map +1 -1
  85. package/dist/server/services/index.mjs +3 -1
  86. package/dist/server/services/index.mjs.map +1 -1
  87. package/dist/server/src/bootstrap.d.ts.map +1 -1
  88. package/dist/server/src/controllers/admin-file.d.ts +3 -0
  89. package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
  90. package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
  91. package/dist/server/src/controllers/index.d.ts +3 -0
  92. package/dist/server/src/controllers/index.d.ts.map +1 -1
  93. package/dist/server/src/index.d.ts +27 -1
  94. package/dist/server/src/index.d.ts.map +1 -1
  95. package/dist/server/src/models/ai-metadata-job.d.ts +5 -0
  96. package/dist/server/src/models/ai-metadata-job.d.ts.map +1 -0
  97. package/dist/server/src/models/index.d.ts +5 -0
  98. package/dist/server/src/models/index.d.ts.map +1 -0
  99. package/dist/server/src/register.d.ts.map +1 -1
  100. package/dist/server/src/routes/admin.d.ts.map +1 -1
  101. package/dist/server/src/services/ai-metadata-jobs.d.ts +14 -0
  102. package/dist/server/src/services/ai-metadata-jobs.d.ts.map +1 -0
  103. package/dist/server/src/services/ai-metadata.d.ts +25 -2
  104. package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
  105. package/dist/server/src/services/index.d.ts +24 -1
  106. package/dist/server/src/services/index.d.ts.map +1 -1
  107. package/dist/server/src/utils/images.d.ts +7 -0
  108. package/dist/server/src/utils/images.d.ts.map +1 -0
  109. package/dist/server/src/utils/index.d.ts +2 -0
  110. package/dist/server/src/utils/index.d.ts.map +1 -1
  111. package/dist/server/utils/images.js +35 -0
  112. package/dist/server/utils/images.js.map +1 -0
  113. package/dist/server/utils/images.mjs +33 -0
  114. package/dist/server/utils/images.mjs.map +1 -0
  115. package/dist/server/utils/index.js.map +1 -1
  116. package/dist/server/utils/index.mjs.map +1 -1
  117. package/dist/shared/contracts/ai-metadata-jobs.d.ts +53 -0
  118. package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -0
  119. package/dist/shared/contracts/files.d.ts +33 -0
  120. package/package.json +6 -5
@@ -0,0 +1,45 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var reactIntl = require('react-intl');
7
+ var reactRouterDom = require('react-router-dom');
8
+ require('byte-size');
9
+ require('date-fns');
10
+ var getTrad = require('../utils/getTrad.js');
11
+ require('qs');
12
+ require('../utils/typeFromMime.js');
13
+ require('../utils/urlYupSchema.js');
14
+ var AIGenerationPage = require('./pages/AIGenerationPage.js');
15
+ var MediaLibraryPage = require('./pages/MediaLibraryPage.js');
16
+
17
+ const UnstableMediaLibraryPage = ()=>{
18
+ const { formatMessage } = reactIntl.useIntl();
19
+ const title = formatMessage({
20
+ id: getTrad.getTrad('plugin.name'),
21
+ defaultMessage: 'Media Library'
22
+ });
23
+ return /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Page.Main, {
24
+ children: [
25
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Page.Title, {
26
+ children: title
27
+ }),
28
+ /*#__PURE__*/ jsxRuntime.jsxs(reactRouterDom.Routes, {
29
+ children: [
30
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
31
+ index: true,
32
+ element: /*#__PURE__*/ jsxRuntime.jsx(MediaLibraryPage.MediaLibraryPage, {})
33
+ }),
34
+ /*#__PURE__*/ jsxRuntime.jsx(reactRouterDom.Route, {
35
+ path: "ai-generation",
36
+ element: /*#__PURE__*/ jsxRuntime.jsx(AIGenerationPage.AIGenerationPage, {})
37
+ })
38
+ ]
39
+ })
40
+ ]
41
+ });
42
+ };
43
+
44
+ exports.UnstableMediaLibraryPage = UnstableMediaLibraryPage;
45
+ //# sourceMappingURL=App.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.js","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { getTrad } from '../utils';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { MediaLibraryPage } from './pages/MediaLibraryPage';\n\nexport const UnstableMediaLibraryPage = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<MediaLibraryPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibraryPage","formatMessage","useIntl","title","id","getTrad","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","MediaLibraryPage","path","AIGenerationPage"],"mappings":";;;;;;;;;;;;;;;;MAWaA,wBAA2B,GAAA,IAAA;IACtC,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAAEG,QAAAA,EAAAA,EAAIC,eAAQ,CAAA,aAAA,CAAA;QAAgBC,cAAgB,EAAA;AAAgB,KAAA,CAAA;IAE1F,qBACEC,eAAA,CAACC,iBAAKC,IAAI,EAAA;;AACR,0BAAAC,cAAA,CAACF,iBAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,eAACK,CAAAA,qBAAAA,EAAAA;;kCACCF,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,cAACM,CAAAA,iCAAAA,EAAAA,EAAAA;;kCACvBN,cAACG,CAAAA,oBAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,cAACQ,CAAAA,iCAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
@@ -0,0 +1,43 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import 'react';
3
+ import { Page } from '@strapi/admin/strapi-admin';
4
+ import { useIntl } from 'react-intl';
5
+ import { Routes, Route } from 'react-router-dom';
6
+ import 'byte-size';
7
+ import 'date-fns';
8
+ import { getTrad } from '../utils/getTrad.mjs';
9
+ import 'qs';
10
+ import '../utils/typeFromMime.mjs';
11
+ import '../utils/urlYupSchema.mjs';
12
+ import { AIGenerationPage } from './pages/AIGenerationPage.mjs';
13
+ import { MediaLibraryPage } from './pages/MediaLibraryPage.mjs';
14
+
15
+ const UnstableMediaLibraryPage = ()=>{
16
+ const { formatMessage } = useIntl();
17
+ const title = formatMessage({
18
+ id: getTrad('plugin.name'),
19
+ defaultMessage: 'Media Library'
20
+ });
21
+ return /*#__PURE__*/ jsxs(Page.Main, {
22
+ children: [
23
+ /*#__PURE__*/ jsx(Page.Title, {
24
+ children: title
25
+ }),
26
+ /*#__PURE__*/ jsxs(Routes, {
27
+ children: [
28
+ /*#__PURE__*/ jsx(Route, {
29
+ index: true,
30
+ element: /*#__PURE__*/ jsx(MediaLibraryPage, {})
31
+ }),
32
+ /*#__PURE__*/ jsx(Route, {
33
+ path: "ai-generation",
34
+ element: /*#__PURE__*/ jsx(AIGenerationPage, {})
35
+ })
36
+ ]
37
+ })
38
+ ]
39
+ });
40
+ };
41
+
42
+ export { UnstableMediaLibraryPage };
43
+ //# sourceMappingURL=App.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"App.mjs","sources":["../../../admin/src/future/App.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Page } from '@strapi/admin/strapi-admin';\nimport { useIntl } from 'react-intl';\nimport { Route, Routes } from 'react-router-dom';\n\nimport { getTrad } from '../utils';\n\nimport { AIGenerationPage } from './pages/AIGenerationPage';\nimport { MediaLibraryPage } from './pages/MediaLibraryPage';\n\nexport const UnstableMediaLibraryPage = () => {\n const { formatMessage } = useIntl();\n const title = formatMessage({ id: getTrad('plugin.name'), defaultMessage: 'Media Library' });\n\n return (\n <Page.Main>\n <Page.Title>{title}</Page.Title>\n\n <Routes>\n <Route index element={<MediaLibraryPage />} />\n <Route path=\"ai-generation\" element={<AIGenerationPage />} />\n </Routes>\n </Page.Main>\n );\n};\n"],"names":["UnstableMediaLibraryPage","formatMessage","useIntl","title","id","getTrad","defaultMessage","_jsxs","Page","Main","_jsx","Title","Routes","Route","index","element","MediaLibraryPage","path","AIGenerationPage"],"mappings":";;;;;;;;;;;;;;MAWaA,wBAA2B,GAAA,IAAA;IACtC,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;AAC1B,IAAA,MAAMC,QAAQF,aAAc,CAAA;AAAEG,QAAAA,EAAAA,EAAIC,OAAQ,CAAA,aAAA,CAAA;QAAgBC,cAAgB,EAAA;AAAgB,KAAA,CAAA;IAE1F,qBACEC,IAAA,CAACC,KAAKC,IAAI,EAAA;;AACR,0BAAAC,GAAA,CAACF,KAAKG,KAAK,EAAA;AAAER,gBAAAA,QAAAA,EAAAA;;0BAEbI,IAACK,CAAAA,MAAAA,EAAAA;;kCACCF,GAACG,CAAAA,KAAAA,EAAAA;wBAAMC,KAAK,EAAA,IAAA;AAACC,wBAAAA,OAAAA,gBAASL,GAACM,CAAAA,gBAAAA,EAAAA,EAAAA;;kCACvBN,GAACG,CAAAA,KAAAA,EAAAA;wBAAMI,IAAK,EAAA,eAAA;AAAgBF,wBAAAA,OAAAA,gBAASL,GAACQ,CAAAA,gBAAAA,EAAAA,EAAAA;;;;;;AAI9C;;;;"}
@@ -0,0 +1,24 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
5
+ var designSystem = require('@strapi/design-system');
6
+
7
+ const AIGenerationPage = ()=>{
8
+ return /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
9
+ children: [
10
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
11
+ title: "AI Generation",
12
+ primaryAction: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Button, {
13
+ children: "TODO: Generate"
14
+ })
15
+ }),
16
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
17
+ children: "TODO: AI ListView"
18
+ })
19
+ ]
20
+ });
21
+ };
22
+
23
+ exports.AIGenerationPage = AIGenerationPage;
24
+ //# sourceMappingURL=AIGenerationPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIGenerationPage.js","sources":["../../../../admin/src/future/pages/AIGenerationPage.tsx"],"sourcesContent":["import { Layouts } from '@strapi/admin/strapi-admin';\nimport { Button } from '@strapi/design-system';\n\nexport const AIGenerationPage = () => {\n return (\n <Layouts.Root>\n <Layouts.Header title=\"AI Generation\" primaryAction={<Button>TODO: Generate</Button>} />\n\n <Layouts.Content>TODO: AI ListView</Layouts.Content>\n </Layouts.Root>\n );\n};\n"],"names":["AIGenerationPage","_jsxs","Layouts","Root","_jsx","Header","title","primaryAction","Button","Content"],"mappings":";;;;;;MAGaA,gBAAmB,GAAA,IAAA;IAC9B,qBACEC,eAAA,CAACC,oBAAQC,IAAI,EAAA;;AACX,0BAAAC,cAAA,CAACF,oBAAQG,MAAM,EAAA;gBAACC,KAAM,EAAA,eAAA;AAAgBC,gBAAAA,aAAAA,gBAAeH,cAACI,CAAAA,mBAAAA,EAAAA;AAAO,oBAAA,QAAA,EAAA;;;AAE7D,0BAAAJ,cAAA,CAACF,oBAAQO,OAAO,EAAA;AAAC,gBAAA,QAAA,EAAA;;;;AAGvB;;;;"}
@@ -0,0 +1,22 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Layouts } from '@strapi/admin/strapi-admin';
3
+ import { Button } from '@strapi/design-system';
4
+
5
+ const AIGenerationPage = ()=>{
6
+ return /*#__PURE__*/ jsxs(Layouts.Root, {
7
+ children: [
8
+ /*#__PURE__*/ jsx(Layouts.Header, {
9
+ title: "AI Generation",
10
+ primaryAction: /*#__PURE__*/ jsx(Button, {
11
+ children: "TODO: Generate"
12
+ })
13
+ }),
14
+ /*#__PURE__*/ jsx(Layouts.Content, {
15
+ children: "TODO: AI ListView"
16
+ })
17
+ ]
18
+ });
19
+ };
20
+
21
+ export { AIGenerationPage };
22
+ //# sourceMappingURL=AIGenerationPage.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIGenerationPage.mjs","sources":["../../../../admin/src/future/pages/AIGenerationPage.tsx"],"sourcesContent":["import { Layouts } from '@strapi/admin/strapi-admin';\nimport { Button } from '@strapi/design-system';\n\nexport const AIGenerationPage = () => {\n return (\n <Layouts.Root>\n <Layouts.Header title=\"AI Generation\" primaryAction={<Button>TODO: Generate</Button>} />\n\n <Layouts.Content>TODO: AI ListView</Layouts.Content>\n </Layouts.Root>\n );\n};\n"],"names":["AIGenerationPage","_jsxs","Layouts","Root","_jsx","Header","title","primaryAction","Button","Content"],"mappings":";;;;MAGaA,gBAAmB,GAAA,IAAA;IAC9B,qBACEC,IAAA,CAACC,QAAQC,IAAI,EAAA;;AACX,0BAAAC,GAAA,CAACF,QAAQG,MAAM,EAAA;gBAACC,KAAM,EAAA,eAAA;AAAgBC,gBAAAA,aAAAA,gBAAeH,GAACI,CAAAA,MAAAA,EAAAA;AAAO,oBAAA,QAAA,EAAA;;;AAE7D,0BAAAJ,GAAA,CAACF,QAAQO,OAAO,EAAA;AAAC,gBAAA,QAAA,EAAA;;;;AAGvB;;;;"}
@@ -0,0 +1,55 @@
1
+ 'use strict';
2
+
3
+ var jsxRuntime = require('react/jsx-runtime');
4
+ require('react');
5
+ var strapiAdmin = require('@strapi/admin/strapi-admin');
6
+ var designSystem = require('@strapi/design-system');
7
+ var reactIntl = require('react-intl');
8
+ require('byte-size');
9
+ require('date-fns');
10
+ var getTrad = require('../../utils/getTrad.js');
11
+ require('qs');
12
+ require('../../utils/typeFromMime.js');
13
+ require('../../utils/urlYupSchema.js');
14
+
15
+ const MediaLibraryPage = ()=>{
16
+ const { formatMessage } = reactIntl.useIntl();
17
+ return(/**
18
+ * NOTE:
19
+ *
20
+ * The design differs from our current Layouts component.
21
+ * Either we find a way to make it work with our current Layouts component
22
+ * or we will have to write our own custom layout.
23
+ */ /*#__PURE__*/ jsxRuntime.jsxs(strapiAdmin.Layouts.Root, {
24
+ children: [
25
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Header, {
26
+ navigationAction: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
27
+ children: "TODO: Breadcrumbs"
28
+ }),
29
+ title: "TODO: Folder location",
30
+ primaryAction: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
31
+ gap: 2,
32
+ children: [
33
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.SearchInput, {
34
+ label: formatMessage({
35
+ id: getTrad.getTrad('search.label'),
36
+ defaultMessage: 'Search for an asset'
37
+ }),
38
+ trackedEvent: "didSearchMediaLibraryElements",
39
+ trackedEventDetails: {
40
+ location: 'upload'
41
+ }
42
+ }),
43
+ "TODO: Toolbar"
44
+ ]
45
+ })
46
+ }),
47
+ /*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.Layouts.Content, {
48
+ children: "TODO: List/Grid views"
49
+ })
50
+ ]
51
+ }));
52
+ };
53
+
54
+ exports.MediaLibraryPage = MediaLibraryPage;
55
+ //# sourceMappingURL=MediaLibraryPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MediaLibraryPage.js","sources":["../../../../admin/src/future/pages/MediaLibraryPage.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { Layouts, SearchInput } from '@strapi/admin/strapi-admin';\nimport { Box, Flex } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const MediaLibraryPage = () => {\n const { formatMessage } = useIntl();\n\n return (\n /**\n * NOTE:\n *\n * The design differs from our current Layouts component.\n * Either we find a way to make it work with our current Layouts component\n * or we will have to write our own custom layout.\n */\n <Layouts.Root>\n <Layouts.Header\n navigationAction={<Box>TODO: Breadcrumbs</Box>}\n title=\"TODO: Folder location\"\n primaryAction={\n <Flex gap={2}>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n TODO: Toolbar\n </Flex>\n }\n />\n\n <Layouts.Content>TODO: List/Grid views</Layouts.Content>\n </Layouts.Root>\n );\n};\n"],"names":["MediaLibraryPage","formatMessage","useIntl","_jsxs","Layouts","Root","_jsx","Header","navigationAction","Box","title","primaryAction","Flex","gap","SearchInput","label","id","getTrad","defaultMessage","trackedEvent","trackedEventDetails","location","Content"],"mappings":";;;;;;;;;;;;;;MAQaA,gBAAmB,GAAA,IAAA;IAC9B,MAAM,EAAEC,aAAa,EAAE,GAAGC,iBAAAA,EAAAA;IAE1B;;;;;;sBAQEC,eAAA,CAACC,oBAAQC,IAAI,EAAA;;AACX,0BAAAC,cAAA,CAACF,oBAAQG,MAAM,EAAA;AACbC,gBAAAA,gBAAAA,gBAAkBF,cAACG,CAAAA,gBAAAA,EAAAA;AAAI,oBAAA,QAAA,EAAA;;gBACvBC,KAAM,EAAA,uBAAA;AACNC,gBAAAA,aAAAA,gBACER,eAACS,CAAAA,iBAAAA,EAAAA;oBAAKC,GAAK,EAAA,CAAA;;sCACTP,cAACQ,CAAAA,uBAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOd,aAAc,CAAA;AACnBe,gCAAAA,EAAAA,EAAIC,eAAQ,CAAA,cAAA,CAAA;gCACZC,cAAgB,EAAA;AAClB,6BAAA,CAAA;4BACAC,YAAa,EAAA,+BAAA;4BACbC,mBAAqB,EAAA;gCAAEC,QAAU,EAAA;AAAS;;AAC1C,wBAAA;;;;AAMR,0BAAAf,cAAA,CAACF,oBAAQkB,OAAO,EAAA;AAAC,gBAAA,QAAA,EAAA;;;;AAGvB;;;;"}
@@ -0,0 +1,53 @@
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import 'react';
3
+ import { Layouts, SearchInput } from '@strapi/admin/strapi-admin';
4
+ import { Box, Flex } from '@strapi/design-system';
5
+ import { useIntl } from 'react-intl';
6
+ import 'byte-size';
7
+ import 'date-fns';
8
+ import { getTrad } from '../../utils/getTrad.mjs';
9
+ import 'qs';
10
+ import '../../utils/typeFromMime.mjs';
11
+ import '../../utils/urlYupSchema.mjs';
12
+
13
+ const MediaLibraryPage = ()=>{
14
+ const { formatMessage } = useIntl();
15
+ return(/**
16
+ * NOTE:
17
+ *
18
+ * The design differs from our current Layouts component.
19
+ * Either we find a way to make it work with our current Layouts component
20
+ * or we will have to write our own custom layout.
21
+ */ /*#__PURE__*/ jsxs(Layouts.Root, {
22
+ children: [
23
+ /*#__PURE__*/ jsx(Layouts.Header, {
24
+ navigationAction: /*#__PURE__*/ jsx(Box, {
25
+ children: "TODO: Breadcrumbs"
26
+ }),
27
+ title: "TODO: Folder location",
28
+ primaryAction: /*#__PURE__*/ jsxs(Flex, {
29
+ gap: 2,
30
+ children: [
31
+ /*#__PURE__*/ jsx(SearchInput, {
32
+ label: formatMessage({
33
+ id: getTrad('search.label'),
34
+ defaultMessage: 'Search for an asset'
35
+ }),
36
+ trackedEvent: "didSearchMediaLibraryElements",
37
+ trackedEventDetails: {
38
+ location: 'upload'
39
+ }
40
+ }),
41
+ "TODO: Toolbar"
42
+ ]
43
+ })
44
+ }),
45
+ /*#__PURE__*/ jsx(Layouts.Content, {
46
+ children: "TODO: List/Grid views"
47
+ })
48
+ ]
49
+ }));
50
+ };
51
+
52
+ export { MediaLibraryPage };
53
+ //# 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, SearchInput } from '@strapi/admin/strapi-admin';\nimport { Box, Flex } from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\n\nimport { getTrad } from '../../utils';\n\nexport const MediaLibraryPage = () => {\n const { formatMessage } = useIntl();\n\n return (\n /**\n * NOTE:\n *\n * The design differs from our current Layouts component.\n * Either we find a way to make it work with our current Layouts component\n * or we will have to write our own custom layout.\n */\n <Layouts.Root>\n <Layouts.Header\n navigationAction={<Box>TODO: Breadcrumbs</Box>}\n title=\"TODO: Folder location\"\n primaryAction={\n <Flex gap={2}>\n <SearchInput\n label={formatMessage({\n id: getTrad('search.label'),\n defaultMessage: 'Search for an asset',\n })}\n trackedEvent=\"didSearchMediaLibraryElements\"\n trackedEventDetails={{ location: 'upload' }}\n />\n TODO: Toolbar\n </Flex>\n }\n />\n\n <Layouts.Content>TODO: List/Grid views</Layouts.Content>\n </Layouts.Root>\n );\n};\n"],"names":["MediaLibraryPage","formatMessage","useIntl","_jsxs","Layouts","Root","_jsx","Header","navigationAction","Box","title","primaryAction","Flex","gap","SearchInput","label","id","getTrad","defaultMessage","trackedEvent","trackedEventDetails","location","Content"],"mappings":";;;;;;;;;;;;MAQaA,gBAAmB,GAAA,IAAA;IAC9B,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAE1B;;;;;;sBAQEC,IAAA,CAACC,QAAQC,IAAI,EAAA;;AACX,0BAAAC,GAAA,CAACF,QAAQG,MAAM,EAAA;AACbC,gBAAAA,gBAAAA,gBAAkBF,GAACG,CAAAA,GAAAA,EAAAA;AAAI,oBAAA,QAAA,EAAA;;gBACvBC,KAAM,EAAA,uBAAA;AACNC,gBAAAA,aAAAA,gBACER,IAACS,CAAAA,IAAAA,EAAAA;oBAAKC,GAAK,EAAA,CAAA;;sCACTP,GAACQ,CAAAA,WAAAA,EAAAA;AACCC,4BAAAA,KAAAA,EAAOd,aAAc,CAAA;AACnBe,gCAAAA,EAAAA,EAAIC,OAAQ,CAAA,cAAA,CAAA;gCACZC,cAAgB,EAAA;AAClB,6BAAA,CAAA;4BACAC,YAAa,EAAA,+BAAA;4BACbC,mBAAqB,EAAA;gCAAEC,QAAU,EAAA;AAAS;;AAC1C,wBAAA;;;;AAMR,0BAAAf,GAAA,CAACF,QAAQkB,OAAO,EAAA;AAAC,gBAAA,QAAA,EAAA;;;;AAGvB;;;;"}
@@ -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;;;;"}
@@ -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.UnstableMediaLibraryPage
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.UnstableMediaLibraryPage,\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","UnstableMediaLibraryPage","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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"}