@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.
- package/dist/admin/future/App.js +45 -0
- package/dist/admin/future/App.js.map +1 -0
- package/dist/admin/future/App.mjs +43 -0
- package/dist/admin/future/App.mjs.map +1 -0
- package/dist/admin/future/pages/AIGenerationPage.js +24 -0
- package/dist/admin/future/pages/AIGenerationPage.js.map +1 -0
- package/dist/admin/future/pages/AIGenerationPage.mjs +22 -0
- package/dist/admin/future/pages/AIGenerationPage.mjs.map +1 -0
- package/dist/admin/future/pages/MediaLibraryPage.js +55 -0
- package/dist/admin/future/pages/MediaLibraryPage.js.map +1 -0
- package/dist/admin/future/pages/MediaLibraryPage.mjs +53 -0
- package/dist/admin/future/pages/MediaLibraryPage.mjs.map +1 -0
- package/dist/admin/hooks/useAIMetadataJob.js +114 -0
- package/dist/admin/hooks/useAIMetadataJob.js.map +1 -0
- package/dist/admin/hooks/useAIMetadataJob.mjs +93 -0
- package/dist/admin/hooks/useAIMetadataJob.mjs.map +1 -0
- package/dist/admin/index.js +23 -4
- package/dist/admin/index.js.map +1 -1
- package/dist/admin/index.mjs +24 -5
- package/dist/admin/index.mjs.map +1 -1
- package/dist/admin/package.json.js +6 -5
- package/dist/admin/package.json.js.map +1 -1
- package/dist/admin/package.json.mjs +6 -5
- package/dist/admin/package.json.mjs.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js +1 -0
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.js.map +1 -1
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs +1 -0
- package/dist/admin/pages/App/ConfigureTheView/ConfigureTheView.mjs.map +1 -1
- package/dist/admin/pages/App/components/Header.js +3 -0
- package/dist/admin/pages/App/components/Header.js.map +1 -1
- package/dist/admin/pages/App/components/Header.mjs +3 -0
- package/dist/admin/pages/App/components/Header.mjs.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.js +252 -67
- package/dist/admin/pages/SettingsPage/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs +256 -71
- package/dist/admin/pages/SettingsPage/SettingsPage.mjs.map +1 -1
- package/dist/admin/src/future/App.d.ts +1 -0
- package/dist/admin/src/future/pages/AIGenerationPage.d.ts +1 -0
- package/dist/admin/src/future/pages/MediaLibraryPage.d.ts +1 -0
- package/dist/admin/src/future/services/api.d.ts +2 -0
- package/dist/admin/src/future/services/settings.d.ts +2 -0
- package/dist/admin/src/hooks/useAIMetadataJob.d.ts +9 -0
- package/dist/admin/translations/de.json.js +44 -1
- package/dist/admin/translations/de.json.js.map +1 -1
- package/dist/admin/translations/de.json.mjs +44 -1
- package/dist/admin/translations/de.json.mjs.map +1 -1
- package/dist/admin/translations/en.json.js +9 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +9 -0
- package/dist/admin/translations/en.json.mjs.map +1 -1
- package/dist/server/bootstrap.js +1 -0
- package/dist/server/bootstrap.js.map +1 -1
- package/dist/server/bootstrap.mjs +1 -0
- package/dist/server/bootstrap.mjs.map +1 -1
- package/dist/server/controllers/admin-file.js +86 -0
- package/dist/server/controllers/admin-file.js.map +1 -1
- package/dist/server/controllers/admin-file.mjs +86 -0
- package/dist/server/controllers/admin-file.mjs.map +1 -1
- package/dist/server/controllers/admin-upload.js +3 -23
- package/dist/server/controllers/admin-upload.js.map +1 -1
- package/dist/server/controllers/admin-upload.mjs +3 -23
- package/dist/server/controllers/admin-upload.mjs.map +1 -1
- package/dist/server/models/ai-metadata-job.js +36 -0
- package/dist/server/models/ai-metadata-job.js.map +1 -0
- package/dist/server/models/ai-metadata-job.mjs +33 -0
- package/dist/server/models/ai-metadata-job.mjs.map +1 -0
- package/dist/server/register.js +3 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +3 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/routes/admin.js +46 -0
- package/dist/server/routes/admin.js.map +1 -1
- package/dist/server/routes/admin.mjs +46 -0
- package/dist/server/routes/admin.mjs.map +1 -1
- package/dist/server/services/ai-metadata-jobs.js +72 -0
- package/dist/server/services/ai-metadata-jobs.js.map +1 -0
- package/dist/server/services/ai-metadata-jobs.mjs +70 -0
- package/dist/server/services/ai-metadata-jobs.mjs.map +1 -0
- package/dist/server/services/ai-metadata.js +170 -20
- package/dist/server/services/ai-metadata.js.map +1 -1
- package/dist/server/services/ai-metadata.mjs +170 -20
- package/dist/server/services/ai-metadata.mjs.map +1 -1
- package/dist/server/services/index.js +3 -1
- package/dist/server/services/index.js.map +1 -1
- package/dist/server/services/index.mjs +3 -1
- package/dist/server/services/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-file.d.ts +3 -0
- package/dist/server/src/controllers/admin-file.d.ts.map +1 -1
- package/dist/server/src/controllers/admin-upload.d.ts.map +1 -1
- package/dist/server/src/controllers/index.d.ts +3 -0
- package/dist/server/src/controllers/index.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +27 -1
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/models/ai-metadata-job.d.ts +5 -0
- package/dist/server/src/models/ai-metadata-job.d.ts.map +1 -0
- package/dist/server/src/models/index.d.ts +5 -0
- package/dist/server/src/models/index.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/routes/admin.d.ts.map +1 -1
- package/dist/server/src/services/ai-metadata-jobs.d.ts +14 -0
- package/dist/server/src/services/ai-metadata-jobs.d.ts.map +1 -0
- package/dist/server/src/services/ai-metadata.d.ts +25 -2
- package/dist/server/src/services/ai-metadata.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +24 -1
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/utils/images.d.ts +7 -0
- package/dist/server/src/utils/images.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +2 -0
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/dist/server/utils/images.js +35 -0
- package/dist/server/utils/images.js.map +1 -0
- package/dist/server/utils/images.mjs +33 -0
- package/dist/server/utils/images.mjs.map +1 -0
- package/dist/server/utils/index.js.map +1 -1
- package/dist/server/utils/index.mjs.map +1 -1
- package/dist/shared/contracts/ai-metadata-jobs.d.ts +53 -0
- package/dist/shared/contracts/ai-metadata-jobs.d.ts.map +1 -0
- package/dist/shared/contracts/files.d.ts +33 -0
- 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;;;;"}
|
package/dist/admin/index.js
CHANGED
|
@@ -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
|
|
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: ()=>
|
|
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
|
|
116
|
+
return __variableDynamicImportRuntime3__(`./translations/${locale}.json`).then(({ default: data })=>{
|
|
98
117
|
return {
|
|
99
118
|
data: prefixPluginTranslations.prefixPluginTranslations(data, pluginId.pluginId),
|
|
100
119
|
locale
|
package/dist/admin/index.js.map
CHANGED
|
@@ -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,
|
|
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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"}
|