@strapi/upload 5.33.4 → 5.35.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js +32 -3
- package/dist/admin/components/EditAssetDialog/EditAssetContent.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs +32 -3
- package/dist/admin/components/EditAssetDialog/EditAssetContent.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/AssetPreview.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js +57 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.js.map +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs +55 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/FocalPointActions.mjs.map +1 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js +96 -20
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs +98 -22
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewBox.mjs.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js +47 -0
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.js.map +1 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs +44 -1
- package/dist/admin/components/EditAssetDialog/PreviewBox/PreviewComponents.mjs.map +1 -1
- 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 +119 -0
- package/dist/admin/future/pages/MediaLibraryPage.js.map +1 -0
- package/dist/admin/future/pages/MediaLibraryPage.mjs +98 -0
- package/dist/admin/future/pages/MediaLibraryPage.mjs.map +1 -0
- package/dist/admin/future/services/api.js +28 -0
- package/dist/admin/future/services/api.js.map +1 -0
- package/dist/admin/future/services/api.mjs +25 -0
- package/dist/admin/future/services/api.mjs.map +1 -0
- package/dist/admin/future/utils/translations.js +8 -0
- package/dist/admin/future/utils/translations.js.map +1 -0
- package/dist/admin/future/utils/translations.mjs +6 -0
- package/dist/admin/future/utils/translations.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/hooks/useEditAsset.js +1 -0
- package/dist/admin/hooks/useEditAsset.js.map +1 -1
- package/dist/admin/hooks/useEditAsset.mjs +1 -0
- package/dist/admin/hooks/useEditAsset.mjs.map +1 -1
- 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/components/EditAssetDialog/PreviewBox/AssetPreview.d.ts +1 -2
- package/dist/admin/src/components/EditAssetDialog/PreviewBox/FocalPointActions.d.ts +7 -0
- package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewBox.d.ts +6 -2
- package/dist/admin/src/components/EditAssetDialog/PreviewBox/PreviewComponents.d.ts +13 -0
- 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 +6 -0
- package/dist/admin/src/future/services/settings.d.ts +2 -0
- package/dist/admin/src/future/utils/translations.d.ts +1 -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 +17 -0
- package/dist/admin/translations/en.json.js.map +1 -1
- package/dist/admin/translations/en.json.mjs +17 -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/content-types/file.js +4 -0
- package/dist/server/content-types/file.js.map +1 -1
- package/dist/server/content-types/file.mjs +4 -0
- package/dist/server/content-types/file.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/controllers/validation/admin/upload.js +5 -0
- package/dist/server/controllers/validation/admin/upload.js.map +1 -1
- package/dist/server/controllers/validation/admin/upload.mjs +5 -0
- package/dist/server/controllers/validation/admin/upload.mjs.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.js +6 -1
- package/dist/server/controllers/validation/content-api/upload.js.map +1 -1
- package/dist/server/controllers/validation/content-api/upload.mjs +6 -1
- package/dist/server/controllers/validation/content-api/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/services/upload.js +3 -1
- package/dist/server/services/upload.js.map +1 -1
- package/dist/server/services/upload.mjs +3 -1
- package/dist/server/services/upload.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/content-types/file.d.ts +4 -0
- package/dist/server/src/content-types/file.d.ts.map +1 -1
- package/dist/server/src/content-types/index.d.ts +4 -0
- package/dist/server/src/content-types/index.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/controllers/validation/admin/upload.d.ts +240 -0
- package/dist/server/src/controllers/validation/admin/upload.d.ts.map +1 -1
- package/dist/server/src/controllers/validation/content-api/upload.d.ts +180 -0
- package/dist/server/src/controllers/validation/content-api/upload.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +32 -2
- 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 +25 -2
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/upload.d.ts +1 -1
- package/dist/server/src/services/upload.d.ts.map +1 -1
- package/dist/server/src/types.d.ts +6 -0
- package/dist/server/src/types.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 +39 -0
- package/package.json +6 -5
|
@@ -10,7 +10,9 @@ var isEqual = require('lodash/isEqual');
|
|
|
10
10
|
var reactIntl = require('react-intl');
|
|
11
11
|
var reactQuery = require('react-query');
|
|
12
12
|
var constants = require('../../constants.js');
|
|
13
|
+
var useAIMetadataJob = require('../../hooks/useAIMetadataJob.js');
|
|
13
14
|
var useSettings = require('../../hooks/useSettings.js');
|
|
15
|
+
var useTracking = require('../../hooks/useTracking.js');
|
|
14
16
|
require('byte-size');
|
|
15
17
|
require('date-fns');
|
|
16
18
|
var getTrad = require('../../utils/getTrad.js');
|
|
@@ -40,13 +42,124 @@ function _interopNamespaceDefault(e) {
|
|
|
40
42
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
41
43
|
|
|
42
44
|
// TODO: find a better naming convention for the file that was an index file before
|
|
43
|
-
|
|
45
|
+
/* -------------------------------------------------------------------------------------------------
|
|
46
|
+
* MetadataAction
|
|
47
|
+
* -----------------------------------------------------------------------------------------------*/ const BetaStatus = (props)=>{
|
|
48
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
49
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Status, {
|
|
50
|
+
size: "S",
|
|
51
|
+
variant: "secondary",
|
|
52
|
+
style: {
|
|
53
|
+
textTransform: 'uppercase',
|
|
54
|
+
display: 'flex'
|
|
55
|
+
},
|
|
56
|
+
...props,
|
|
57
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
58
|
+
tag: "span",
|
|
59
|
+
variant: "pi",
|
|
60
|
+
fontWeight: "bold",
|
|
61
|
+
children: formatMessage({
|
|
62
|
+
id: 'app.components.Status.beta',
|
|
63
|
+
defaultMessage: 'Beta'
|
|
64
|
+
})
|
|
65
|
+
})
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
const MetadataAction = ({ job, imagesWithoutMetadataCount, isConfirmDialogOpen, onConfirmDialogChange, onGenerate })=>{
|
|
69
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
70
|
+
// If there's an active job processing
|
|
71
|
+
if (job?.status === 'processing') {
|
|
72
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
73
|
+
gap: 2,
|
|
74
|
+
alignItems: "center",
|
|
75
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
76
|
+
variant: "pi",
|
|
77
|
+
textColor: "neutral600",
|
|
78
|
+
children: formatMessage({
|
|
79
|
+
id: getTrad.getTrad('settings.form.aiMetadata.generatingMetadata'),
|
|
80
|
+
defaultMessage: 'AI is generating your metadata'
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
// Only show completed state when all images have metadata
|
|
86
|
+
if (imagesWithoutMetadataCount === 0) {
|
|
87
|
+
return /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
88
|
+
variant: "pi",
|
|
89
|
+
textColor: "primary600",
|
|
90
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
91
|
+
gap: 2,
|
|
92
|
+
alignItems: "center",
|
|
93
|
+
children: [
|
|
94
|
+
/*#__PURE__*/ jsxRuntime.jsx(icons.Check, {
|
|
95
|
+
width: "16px",
|
|
96
|
+
height: "16px"
|
|
97
|
+
}),
|
|
98
|
+
formatMessage({
|
|
99
|
+
id: getTrad.getTrad('settings.form.aiMetadata.metadataGenerated'),
|
|
100
|
+
defaultMessage: 'Your metadata has been generated'
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
return /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Dialog.Root, {
|
|
107
|
+
open: isConfirmDialogOpen,
|
|
108
|
+
onOpenChange: onConfirmDialogChange,
|
|
109
|
+
children: [
|
|
110
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Dialog.Trigger, {
|
|
111
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.TextButton, {
|
|
112
|
+
disabled: imagesWithoutMetadataCount === 0,
|
|
113
|
+
children: formatMessage({
|
|
114
|
+
id: getTrad.getTrad('settings.form.aiMetadata.generateButton'),
|
|
115
|
+
defaultMessage: 'Generate metadata'
|
|
116
|
+
})
|
|
117
|
+
})
|
|
118
|
+
}),
|
|
119
|
+
/*#__PURE__*/ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, {
|
|
120
|
+
variant: "success-light",
|
|
121
|
+
onConfirm: onGenerate,
|
|
122
|
+
title: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
123
|
+
gap: 2,
|
|
124
|
+
children: [
|
|
125
|
+
/*#__PURE__*/ jsxRuntime.jsx(BetaStatus, {}),
|
|
126
|
+
formatMessage({
|
|
127
|
+
id: getTrad.getTrad('settings.form.aiMetadata.confirmDialog.title'),
|
|
128
|
+
defaultMessage: 'Generate AI Metadata'
|
|
129
|
+
})
|
|
130
|
+
]
|
|
131
|
+
}),
|
|
132
|
+
children: formatMessage({
|
|
133
|
+
id: getTrad.getTrad('settings.form.aiMetadata.confirmDialog.message'),
|
|
134
|
+
defaultMessage: 'This will start a process in the background to generate captions and alternative text for {count, plural, one {# image} other {# images}}. AI can make mistakes, be sure to review the generated content.'
|
|
135
|
+
}, {
|
|
136
|
+
count: imagesWithoutMetadataCount
|
|
137
|
+
})
|
|
138
|
+
})
|
|
139
|
+
]
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
/* -------------------------------------------------------------------------------------------------
|
|
143
|
+
* SettingsPage
|
|
144
|
+
* -----------------------------------------------------------------------------------------------*/ const SettingsPage = ()=>{
|
|
44
145
|
const { formatMessage } = reactIntl.useIntl();
|
|
45
146
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
46
|
-
const { put } = strapiAdmin.useFetchClient();
|
|
147
|
+
const { put, post, get } = strapiAdmin.useFetchClient();
|
|
148
|
+
const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React__namespace.useState(false);
|
|
149
|
+
const { trackUsage } = useTracking.useTracking();
|
|
47
150
|
const [{ initialData, modifiedData }, dispatch] = React__namespace.useReducer(reducer.reducer, reducer.initialState, init.init);
|
|
48
151
|
const { data, isLoading, refetch } = useSettings.useSettings();
|
|
49
152
|
const isAIAvailable = ee.useAIAvailability();
|
|
153
|
+
const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = reactQuery.useQuery([
|
|
154
|
+
'ai-metadata-count'
|
|
155
|
+
], async ()=>{
|
|
156
|
+
const { data } = await get('/upload/actions/generate-ai-metadata/count');
|
|
157
|
+
return data;
|
|
158
|
+
}, {
|
|
159
|
+
enabled: isAIAvailable && !!data?.aiMetadata,
|
|
160
|
+
retry: false
|
|
161
|
+
});
|
|
162
|
+
const imagesWithoutMetadataCount = imageCountResponse?.imagesWithoutMetadataCount ?? 0;
|
|
50
163
|
React__namespace.useEffect(()=>{
|
|
51
164
|
if (data) {
|
|
52
165
|
dispatch({
|
|
@@ -80,6 +193,29 @@ const SettingsPage = ()=>{
|
|
|
80
193
|
});
|
|
81
194
|
}
|
|
82
195
|
});
|
|
196
|
+
// Poll for latest active job - notifications are handled inside the hook
|
|
197
|
+
const { data: aiMetadataJob, refetch: refetchAiMetadataJob } = useAIMetadataJob.useAIMetadataJob({
|
|
198
|
+
enabled: isAIAvailable
|
|
199
|
+
});
|
|
200
|
+
const { mutateAsync: startGenerateAIMetadata } = reactQuery.useMutation(async ()=>{
|
|
201
|
+
const { data } = await post('/upload/actions/generate-ai-metadata', {});
|
|
202
|
+
return data;
|
|
203
|
+
}, {
|
|
204
|
+
onSuccess () {
|
|
205
|
+
setIsConfirmDialogOpen(false);
|
|
206
|
+
// Refetch job status to start polling the new job
|
|
207
|
+
refetchAiMetadataJob();
|
|
208
|
+
},
|
|
209
|
+
onError (err) {
|
|
210
|
+
toggleNotification({
|
|
211
|
+
type: 'danger',
|
|
212
|
+
message: err?.message || formatMessage({
|
|
213
|
+
id: 'notification.error'
|
|
214
|
+
})
|
|
215
|
+
});
|
|
216
|
+
setIsConfirmDialogOpen(false);
|
|
217
|
+
}
|
|
218
|
+
});
|
|
83
219
|
const handleSubmit = async (e)=>{
|
|
84
220
|
e.preventDefault();
|
|
85
221
|
if (isSaveButtonDisabled) {
|
|
@@ -120,6 +256,7 @@ const SettingsPage = ()=>{
|
|
|
120
256
|
type: "submit",
|
|
121
257
|
startIcon: /*#__PURE__*/ jsxRuntime.jsx(icons.Check, {}),
|
|
122
258
|
size: "S",
|
|
259
|
+
fullWidth: true,
|
|
123
260
|
children: formatMessage({
|
|
124
261
|
id: 'global.save',
|
|
125
262
|
defaultMessage: 'Save'
|
|
@@ -142,81 +279,129 @@ const SettingsPage = ()=>{
|
|
|
142
279
|
padding: 6,
|
|
143
280
|
shadow: "filterShadow",
|
|
144
281
|
hasRadius: true,
|
|
145
|
-
children: /*#__PURE__*/ jsxRuntime.
|
|
282
|
+
children: /*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
146
283
|
direction: "column",
|
|
147
284
|
alignItems: "stretch",
|
|
148
285
|
gap: 1,
|
|
149
|
-
children:
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
286
|
+
children: [
|
|
287
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Root, {
|
|
288
|
+
gap: 6,
|
|
289
|
+
children: [
|
|
290
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Grid.Item, {
|
|
291
|
+
col: 8,
|
|
292
|
+
xs: 12,
|
|
293
|
+
direction: "column",
|
|
294
|
+
alignItems: "stretch",
|
|
295
|
+
children: [
|
|
296
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
297
|
+
gap: 2,
|
|
298
|
+
children: [
|
|
299
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
300
|
+
color: "alternative700",
|
|
301
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(icons.Sparkle, {})
|
|
302
|
+
}),
|
|
303
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
304
|
+
variant: "delta",
|
|
305
|
+
tag: "h2",
|
|
306
|
+
children: formatMessage({
|
|
307
|
+
id: getTrad.getTrad('settings.form.aiMetadata.label'),
|
|
308
|
+
defaultMessage: 'Generate AI captions and alt texts automatically on upload!'
|
|
309
|
+
})
|
|
310
|
+
})
|
|
311
|
+
]
|
|
312
|
+
}),
|
|
313
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Flex, {
|
|
314
|
+
paddingTop: 1,
|
|
315
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
316
|
+
variant: "pi",
|
|
317
|
+
textColor: "neutral600",
|
|
168
318
|
children: formatMessage({
|
|
169
|
-
id: getTrad.getTrad('settings.form.aiMetadata.
|
|
170
|
-
defaultMessage: '
|
|
319
|
+
id: getTrad.getTrad('settings.form.aiMetadata.description'),
|
|
320
|
+
defaultMessage: 'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.'
|
|
171
321
|
})
|
|
172
322
|
})
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
323
|
+
})
|
|
324
|
+
]
|
|
325
|
+
}),
|
|
326
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Grid.Item, {
|
|
327
|
+
col: 4,
|
|
328
|
+
xs: 12,
|
|
329
|
+
direction: "column",
|
|
330
|
+
alignItems: "end",
|
|
331
|
+
justifyContent: 'center',
|
|
332
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Field.Root, {
|
|
333
|
+
name: "aiMetadata",
|
|
334
|
+
minWidth: "200px",
|
|
335
|
+
children: /*#__PURE__*/ jsxRuntime.jsx(designSystem.Toggle, {
|
|
336
|
+
checked: modifiedData?.aiMetadata,
|
|
337
|
+
offLabel: formatMessage({
|
|
338
|
+
id: 'app.components.ToggleCheckbox.disabled-label',
|
|
339
|
+
defaultMessage: 'Disabled'
|
|
340
|
+
}),
|
|
341
|
+
onLabel: formatMessage({
|
|
342
|
+
id: 'app.components.ToggleCheckbox.enabled-label',
|
|
343
|
+
defaultMessage: 'Enabled'
|
|
344
|
+
}),
|
|
345
|
+
onChange: (e)=>{
|
|
346
|
+
handleChange({
|
|
347
|
+
target: {
|
|
348
|
+
name: 'aiMetadata',
|
|
349
|
+
value: e.target.checked
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
}
|
|
184
353
|
})
|
|
185
354
|
})
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
355
|
+
})
|
|
356
|
+
]
|
|
357
|
+
}),
|
|
358
|
+
initialData?.aiMetadata && !isLoadingImagesWithoutMetadataCount && Boolean(imageCountResponse?.totalImages) && /*#__PURE__*/ jsxRuntime.jsxs(jsxRuntime.Fragment, {
|
|
359
|
+
children: [
|
|
360
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Divider, {
|
|
361
|
+
marginTop: 4,
|
|
362
|
+
marginBottom: 4
|
|
363
|
+
}),
|
|
364
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
365
|
+
justifyContent: "space-between",
|
|
366
|
+
alignItems: "center",
|
|
367
|
+
gap: 2,
|
|
368
|
+
children: [
|
|
369
|
+
/*#__PURE__*/ jsxRuntime.jsxs(designSystem.Flex, {
|
|
370
|
+
gap: 2,
|
|
371
|
+
children: [
|
|
372
|
+
/*#__PURE__*/ jsxRuntime.jsx(BetaStatus, {
|
|
373
|
+
size: "XS"
|
|
374
|
+
}),
|
|
375
|
+
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Typography, {
|
|
376
|
+
variant: "pi",
|
|
377
|
+
textColor: "neutral500",
|
|
378
|
+
children: imagesWithoutMetadataCount === 0 ? formatMessage({
|
|
379
|
+
id: getTrad.getTrad('settings.form.aiMetadata.allAssetsHaveMetadata'),
|
|
380
|
+
defaultMessage: 'All assets have caption and alt text'
|
|
381
|
+
}) : formatMessage({
|
|
382
|
+
id: getTrad.getTrad('settings.form.aiMetadata.imagesWithoutMetadata'),
|
|
383
|
+
defaultMessage: '{count, plural, one {# image lacks captions or alternative text} other {# images lack captions or alternative text}}'
|
|
384
|
+
}, {
|
|
385
|
+
count: imagesWithoutMetadataCount
|
|
386
|
+
})
|
|
387
|
+
})
|
|
388
|
+
]
|
|
206
389
|
}),
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
390
|
+
/*#__PURE__*/ jsxRuntime.jsx(MetadataAction, {
|
|
391
|
+
job: aiMetadataJob ?? null,
|
|
392
|
+
imagesWithoutMetadataCount: imagesWithoutMetadataCount,
|
|
393
|
+
isConfirmDialogOpen: isConfirmDialogOpen,
|
|
394
|
+
onConfirmDialogChange: setIsConfirmDialogOpen,
|
|
395
|
+
onGenerate: async ()=>{
|
|
396
|
+
await startGenerateAIMetadata();
|
|
397
|
+
trackUsage('didGenerateMetadataRetroactively');
|
|
398
|
+
}
|
|
399
|
+
})
|
|
400
|
+
]
|
|
216
401
|
})
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
402
|
+
]
|
|
403
|
+
})
|
|
404
|
+
]
|
|
220
405
|
})
|
|
221
406
|
}),
|
|
222
407
|
/*#__PURE__*/ jsxRuntime.jsx(designSystem.Box, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage.js","sources":["../../../../admin/src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport { Page, useNotification, useFetchClient, Layouts } from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\nimport { Box, Button, Flex, Grid, Toggle, Typography, Field } from '@strapi/design-system';\nimport { Check, Sparkle } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useMutation } from 'react-query';\n\nimport { UpdateSettings } from '../../../../shared/contracts/settings';\nimport { PERMISSIONS } from '../../constants';\nimport { useSettings } from '../../hooks/useSettings';\nimport { getTrad } from '../../utils';\n\nimport { init } from './init';\nimport { initialState, reducer } from './reducer';\n\nimport type { InitialState } from './reducer';\n\nexport const SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { put } = useFetchClient();\n\n const [{ initialData, modifiedData }, dispatch] = React.useReducer(reducer, initialState, init);\n\n const { data, isLoading, refetch } = useSettings();\n const isAIAvailable = useAIAvailability();\n\n React.useEffect(() => {\n if (data) {\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n });\n }\n }, [data]);\n\n const isSaveButtonDisabled = isEqual(initialData, modifiedData);\n\n const { mutateAsync, isLoading: isSubmitting } = useMutation<\n UpdateSettings.Response['data'],\n UpdateSettings.Response['error'],\n UpdateSettings.Request['body']\n >(\n async (body) => {\n const { data } = await put('/upload/settings', body);\n\n return data;\n },\n {\n onSuccess() {\n refetch();\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.form.success.fields' }),\n });\n },\n onError(err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (isSaveButtonDisabled) {\n return;\n }\n\n await mutateAsync(modifiedData!);\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof NonNullable<InitialState['initialData']>; value: boolean };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Page.Title>\n {formatMessage({\n id: getTrad('page.title'),\n defaultMessage: 'Settings - Media Library',\n })}\n </Page.Title>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTrad('settings.header.label'),\n defaultMessage: 'Media Library',\n })}\n primaryAction={\n <Button\n disabled={isSaveButtonDisabled}\n loading={isSubmitting}\n type=\"submit\"\n startIcon={<Check />}\n size=\"S\"\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('settings.sub-header.label'),\n defaultMessage: 'Configure the settings for the Media Library',\n })}\n />\n <Layouts.Content>\n <Layouts.Root>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n {isAIAvailable && (\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Grid.Root gap={6}>\n <Grid.Item col={8} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Flex gap={2}>\n <Box color=\"alternative700\">\n <Sparkle />\n </Box>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.label'),\n defaultMessage:\n 'Generate AI captions and alt texts automatically on upload!',\n })}\n </Typography>\n </Flex>\n <Flex paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.description'),\n defaultMessage:\n 'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.',\n })}\n </Typography>\n </Flex>\n </Grid.Item>\n <Grid.Item\n col={4}\n xs={12}\n direction=\"column\"\n alignItems=\"end\"\n justifyContent={'center'}\n >\n <Field.Root name=\"aiMetadata\" minWidth=\"200px\">\n <Toggle\n checked={modifiedData?.aiMetadata}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.disabled-label',\n defaultMessage: 'Disabled',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.enabled-label',\n defaultMessage: 'Enabled',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'aiMetadata', value: e.target.checked },\n });\n }}\n />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Box>\n )}\n\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTrad('settings.blockTitle'),\n defaultMessage: 'Asset management',\n })}\n </Typography>\n </Flex>\n <Grid.Root gap={6}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.responsiveDimensions.description'),\n defaultMessage:\n 'Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset.',\n })}\n name=\"responsiveDimensions\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.responsiveDimensions.label'),\n defaultMessage: 'Responsive friendly upload',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.responsiveDimensions}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'responsiveDimensions', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.sizeOptimization.description'),\n defaultMessage:\n 'Enabling this option will reduce the image size and slightly reduce its quality.',\n })}\n name=\"sizeOptimization\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.sizeOptimization.label'),\n defaultMessage: 'Size optimization',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.sizeOptimization}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'sizeOptimization', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.autoOrientation.description'),\n defaultMessage:\n 'Enabling this option will automatically rotate the image according to EXIF orientation tag.',\n })}\n name=\"autoOrientation\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.autoOrientation.label'),\n defaultMessage: 'Auto orientation',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.autoOrientation}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoOrientation', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Box>\n </Flex>\n </Layouts.Root>\n </Layouts.Content>\n </form>\n </Page.Main>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n"],"names":["SettingsPage","formatMessage","useIntl","toggleNotification","useNotification","put","useFetchClient","initialData","modifiedData","dispatch","React","useReducer","reducer","initialState","init","data","isLoading","refetch","useSettings","isAIAvailable","useAIAvailability","useEffect","type","isSaveButtonDisabled","isEqual","mutateAsync","isSubmitting","useMutation","body","onSuccess","message","id","onError","err","handleSubmit","e","preventDefault","handleChange","target","name","value","keys","_jsx","Page","Loading","_jsxs","Main","tabIndex","Title","getTrad","defaultMessage","form","onSubmit","Layouts","Header","title","primaryAction","Button","disabled","loading","startIcon","Check","size","subtitle","Content","Root","Flex","direction","alignItems","gap","Box","background","padding","shadow","hasRadius","Grid","Item","col","xs","color","Sparkle","Typography","variant","tag","paddingTop","textColor","justifyContent","Field","minWidth","Toggle","checked","aiMetadata","offLabel","onLabel","onChange","hint","Label","responsiveDimensions","Hint","sizeOptimization","autoOrientation","ProtectedSettingsPage","Protect","permissions","PERMISSIONS","settings"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","sources":["../../../../admin/src/pages/SettingsPage/SettingsPage.tsx"],"sourcesContent":["// TODO: find a better naming convention for the file that was an index file before\nimport * as React from 'react';\n\nimport {\n Page,\n useNotification,\n useFetchClient,\n Layouts,\n ConfirmDialog,\n} from '@strapi/admin/strapi-admin';\nimport { useAIAvailability } from '@strapi/admin/strapi-admin/ee';\nimport {\n Box,\n Button,\n Dialog,\n Flex,\n Grid,\n Toggle,\n Typography,\n Field,\n Status,\n Divider,\n StatusProps,\n TextButton,\n} from '@strapi/design-system';\nimport { Check, Sparkle } from '@strapi/icons';\nimport isEqual from 'lodash/isEqual';\nimport { useIntl } from 'react-intl';\nimport { useMutation, useQuery } from 'react-query';\n\nimport { AIMetadataJob } from '../../../../shared/contracts/ai-metadata-jobs';\nimport { GetAIMetadataCount, GenerateAIMetadata } from '../../../../shared/contracts/files';\nimport { UpdateSettings } from '../../../../shared/contracts/settings';\nimport { PERMISSIONS } from '../../constants';\nimport { useAIMetadataJob } from '../../hooks/useAIMetadataJob';\nimport { useSettings } from '../../hooks/useSettings';\nimport { useTracking } from '../../hooks/useTracking';\nimport { getTrad } from '../../utils';\n\nimport { init } from './init';\nimport { initialState, reducer } from './reducer';\n\nimport type { InitialState } from './reducer';\n\n/* -------------------------------------------------------------------------------------------------\n * MetadataAction\n * -----------------------------------------------------------------------------------------------*/\n\nconst BetaStatus = (props: Omit<StatusProps, 'children'>) => {\n const { formatMessage } = useIntl();\n\n return (\n <Status\n size=\"S\"\n variant=\"secondary\"\n style={{ textTransform: 'uppercase', display: 'flex' }}\n {...props}\n >\n <Typography tag=\"span\" variant=\"pi\" fontWeight=\"bold\">\n {formatMessage({\n id: 'app.components.Status.beta',\n defaultMessage: 'Beta',\n })}\n </Typography>\n </Status>\n );\n};\n\ninterface MetadataActionProps {\n job: AIMetadataJob | null;\n imagesWithoutMetadataCount: number;\n isConfirmDialogOpen: boolean;\n onConfirmDialogChange: (open: boolean) => void;\n onGenerate: () => Promise<void>;\n}\n\nconst MetadataAction = ({\n job,\n imagesWithoutMetadataCount,\n isConfirmDialogOpen,\n onConfirmDialogChange,\n onGenerate,\n}: MetadataActionProps) => {\n const { formatMessage } = useIntl();\n\n // If there's an active job processing\n if (job?.status === 'processing') {\n return (\n <Flex gap={2} alignItems=\"center\">\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.generatingMetadata'),\n defaultMessage: 'AI is generating your metadata',\n })}\n </Typography>\n </Flex>\n );\n }\n\n // Only show completed state when all images have metadata\n if (imagesWithoutMetadataCount === 0) {\n return (\n <Typography variant=\"pi\" textColor=\"primary600\">\n <Flex gap={2} alignItems=\"center\">\n <Check width=\"16px\" height=\"16px\" />\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.metadataGenerated'),\n defaultMessage: 'Your metadata has been generated',\n })}\n </Flex>\n </Typography>\n );\n }\n\n return (\n <Dialog.Root open={isConfirmDialogOpen} onOpenChange={onConfirmDialogChange}>\n <Dialog.Trigger>\n <TextButton disabled={imagesWithoutMetadataCount === 0}>\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.generateButton'),\n defaultMessage: 'Generate metadata',\n })}\n </TextButton>\n </Dialog.Trigger>\n <ConfirmDialog\n variant=\"success-light\"\n onConfirm={onGenerate}\n title={\n <Flex gap={2}>\n <BetaStatus />\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.confirmDialog.title'),\n defaultMessage: 'Generate AI Metadata',\n })}\n </Flex>\n }\n >\n {formatMessage(\n {\n id: getTrad('settings.form.aiMetadata.confirmDialog.message'),\n defaultMessage:\n 'This will start a process in the background to generate captions and alternative text for {count, plural, one {# image} other {# images}}. AI can make mistakes, be sure to review the generated content.',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </ConfirmDialog>\n </Dialog.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * SettingsPage\n * -----------------------------------------------------------------------------------------------*/\n\nexport const SettingsPage = () => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const { put, post, get } = useFetchClient();\n const [isConfirmDialogOpen, setIsConfirmDialogOpen] = React.useState(false);\n const { trackUsage } = useTracking();\n\n const [{ initialData, modifiedData }, dispatch] = React.useReducer(reducer, initialState, init);\n\n const { data, isLoading, refetch } = useSettings();\n const isAIAvailable = useAIAvailability();\n\n const { data: imageCountResponse, isLoading: isLoadingImagesWithoutMetadataCount } = useQuery<\n GetAIMetadataCount.Response['data'],\n GetAIMetadataCount.Response['error']\n >(\n ['ai-metadata-count'],\n async () => {\n const { data } = await get('/upload/actions/generate-ai-metadata/count');\n return data;\n },\n {\n enabled: isAIAvailable && !!data?.aiMetadata,\n retry: false,\n }\n );\n\n const imagesWithoutMetadataCount = imageCountResponse?.imagesWithoutMetadataCount ?? 0;\n\n React.useEffect(() => {\n if (data) {\n dispatch({\n type: 'GET_DATA_SUCCEEDED',\n data,\n });\n }\n }, [data]);\n\n const isSaveButtonDisabled = isEqual(initialData, modifiedData);\n\n const { mutateAsync, isLoading: isSubmitting } = useMutation<\n UpdateSettings.Response['data'],\n UpdateSettings.Response['error'],\n UpdateSettings.Request['body']\n >(\n async (body) => {\n const { data } = await put('/upload/settings', body);\n\n return data;\n },\n {\n onSuccess() {\n refetch();\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'notification.form.success.fields' }),\n });\n },\n onError(err: any) {\n toggleNotification({\n type: 'danger',\n message: err.message || formatMessage({ id: 'notification.error' }),\n });\n },\n }\n );\n\n // Poll for latest active job - notifications are handled inside the hook\n const { data: aiMetadataJob, refetch: refetchAiMetadataJob } = useAIMetadataJob({\n enabled: isAIAvailable,\n });\n\n const { mutateAsync: startGenerateAIMetadata } = useMutation<\n GenerateAIMetadata.Response['data'],\n GenerateAIMetadata.Response['error'],\n void\n >(\n async () => {\n const { data } = await post('/upload/actions/generate-ai-metadata', {});\n return data;\n },\n {\n onSuccess() {\n setIsConfirmDialogOpen(false);\n // Refetch job status to start polling the new job\n refetchAiMetadataJob();\n },\n onError(err) {\n toggleNotification({\n type: 'danger',\n message: (err as Error)?.message || formatMessage({ id: 'notification.error' }),\n });\n setIsConfirmDialogOpen(false);\n },\n }\n );\n\n const handleSubmit = async (e: React.FormEvent<HTMLFormElement>) => {\n e.preventDefault();\n\n if (isSaveButtonDisabled) {\n return;\n }\n\n await mutateAsync(modifiedData!);\n };\n\n const handleChange = ({\n target: { name, value },\n }: {\n target: { name: keyof NonNullable<InitialState['initialData']>; value: boolean };\n }) => {\n dispatch({\n type: 'ON_CHANGE',\n keys: name,\n value,\n });\n };\n\n if (isLoading) {\n return <Page.Loading />;\n }\n\n return (\n <Page.Main tabIndex={-1}>\n <Page.Title>\n {formatMessage({\n id: getTrad('page.title'),\n defaultMessage: 'Settings - Media Library',\n })}\n </Page.Title>\n <form onSubmit={handleSubmit}>\n <Layouts.Header\n title={formatMessage({\n id: getTrad('settings.header.label'),\n defaultMessage: 'Media Library',\n })}\n primaryAction={\n <Button\n disabled={isSaveButtonDisabled}\n loading={isSubmitting}\n type=\"submit\"\n startIcon={<Check />}\n size=\"S\"\n fullWidth\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n }\n subtitle={formatMessage({\n id: getTrad('settings.sub-header.label'),\n defaultMessage: 'Configure the settings for the Media Library',\n })}\n />\n <Layouts.Content>\n <Layouts.Root>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n {/* AI features section when ai is available */}\n {isAIAvailable && (\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={1}>\n <Grid.Root gap={6}>\n <Grid.Item col={8} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Flex gap={2}>\n <Box color=\"alternative700\">\n <Sparkle />\n </Box>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.label'),\n defaultMessage:\n 'Generate AI captions and alt texts automatically on upload!',\n })}\n </Typography>\n </Flex>\n <Flex paddingTop={1}>\n <Typography variant=\"pi\" textColor=\"neutral600\">\n {formatMessage({\n id: getTrad('settings.form.aiMetadata.description'),\n defaultMessage:\n 'Enable this feature to save time, optimize your SEO and increase accessibility by letting our AI generate captions and alternative texts for you.',\n })}\n </Typography>\n </Flex>\n </Grid.Item>\n <Grid.Item\n col={4}\n xs={12}\n direction=\"column\"\n alignItems=\"end\"\n justifyContent={'center'}\n >\n <Field.Root name=\"aiMetadata\" minWidth=\"200px\">\n <Toggle\n checked={modifiedData?.aiMetadata}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.disabled-label',\n defaultMessage: 'Disabled',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.enabled-label',\n defaultMessage: 'Enabled',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'aiMetadata', value: e.target.checked },\n });\n }}\n />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n {/* Retroactive metadata generation when aiMetadata is enabled */}\n {initialData?.aiMetadata &&\n !isLoadingImagesWithoutMetadataCount &&\n Boolean(imageCountResponse?.totalImages) && (\n <>\n <Divider marginTop={4} marginBottom={4} />\n <Flex justifyContent=\"space-between\" alignItems=\"center\" gap={2}>\n <Flex gap={2}>\n <BetaStatus size=\"XS\" />\n <Typography variant=\"pi\" textColor=\"neutral500\">\n {imagesWithoutMetadataCount === 0\n ? formatMessage({\n id: getTrad('settings.form.aiMetadata.allAssetsHaveMetadata'),\n defaultMessage: 'All assets have caption and alt text',\n })\n : formatMessage(\n {\n id: getTrad(\n 'settings.form.aiMetadata.imagesWithoutMetadata'\n ),\n defaultMessage:\n '{count, plural, one {# image lacks captions or alternative text} other {# images lack captions or alternative text}}',\n },\n { count: imagesWithoutMetadataCount }\n )}\n </Typography>\n </Flex>\n <MetadataAction\n job={aiMetadataJob ?? null}\n imagesWithoutMetadataCount={imagesWithoutMetadataCount}\n isConfirmDialogOpen={isConfirmDialogOpen}\n onConfirmDialogChange={setIsConfirmDialogOpen}\n onGenerate={async () => {\n await startGenerateAIMetadata();\n trackUsage('didGenerateMetadataRetroactively');\n }}\n />\n </Flex>\n </>\n )}\n </Flex>\n </Box>\n )}\n\n <Box background=\"neutral0\" padding={6} shadow=\"filterShadow\" hasRadius>\n <Flex direction=\"column\" alignItems=\"stretch\" gap={4}>\n <Flex>\n <Typography variant=\"delta\" tag=\"h2\">\n {formatMessage({\n id: getTrad('settings.blockTitle'),\n defaultMessage: 'Asset management',\n })}\n </Typography>\n </Flex>\n <Grid.Root gap={6}>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.responsiveDimensions.description'),\n defaultMessage:\n 'Enabling this option will generate multiple formats (small, medium and large) of the uploaded asset.',\n })}\n name=\"responsiveDimensions\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.responsiveDimensions.label'),\n defaultMessage: 'Responsive friendly upload',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.responsiveDimensions}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'responsiveDimensions', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.sizeOptimization.description'),\n defaultMessage:\n 'Enabling this option will reduce the image size and slightly reduce its quality.',\n })}\n name=\"sizeOptimization\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.sizeOptimization.label'),\n defaultMessage: 'Size optimization',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.sizeOptimization}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'sizeOptimization', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n <Grid.Item col={6} xs={12} direction=\"column\" alignItems=\"stretch\">\n <Field.Root\n hint={formatMessage({\n id: getTrad('settings.form.autoOrientation.description'),\n defaultMessage:\n 'Enabling this option will automatically rotate the image according to EXIF orientation tag.',\n })}\n name=\"autoOrientation\"\n >\n <Field.Label>\n {formatMessage({\n id: getTrad('settings.form.autoOrientation.label'),\n defaultMessage: 'Auto orientation',\n })}\n </Field.Label>\n <Toggle\n checked={modifiedData?.autoOrientation}\n offLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.off-label',\n defaultMessage: 'Off',\n })}\n onLabel={formatMessage({\n id: 'app.components.ToggleCheckbox.on-label',\n defaultMessage: 'On',\n })}\n onChange={(e) => {\n handleChange({\n target: { name: 'autoOrientation', value: e.target.checked },\n });\n }}\n />\n <Field.Hint />\n </Field.Root>\n </Grid.Item>\n </Grid.Root>\n </Flex>\n </Box>\n </Flex>\n </Layouts.Root>\n </Layouts.Content>\n </form>\n </Page.Main>\n );\n};\n\nexport const ProtectedSettingsPage = () => (\n <Page.Protect permissions={PERMISSIONS.settings}>\n <SettingsPage />\n </Page.Protect>\n);\n"],"names":["BetaStatus","props","formatMessage","useIntl","_jsx","Status","size","variant","style","textTransform","display","Typography","tag","fontWeight","id","defaultMessage","MetadataAction","job","imagesWithoutMetadataCount","isConfirmDialogOpen","onConfirmDialogChange","onGenerate","status","Flex","gap","alignItems","textColor","getTrad","_jsxs","Check","width","height","Dialog","Root","open","onOpenChange","Trigger","TextButton","disabled","ConfirmDialog","onConfirm","title","count","SettingsPage","toggleNotification","useNotification","put","post","get","useFetchClient","setIsConfirmDialogOpen","React","useState","trackUsage","useTracking","initialData","modifiedData","dispatch","useReducer","reducer","initialState","init","data","isLoading","refetch","useSettings","isAIAvailable","useAIAvailability","imageCountResponse","isLoadingImagesWithoutMetadataCount","useQuery","enabled","aiMetadata","retry","useEffect","type","isSaveButtonDisabled","isEqual","mutateAsync","isSubmitting","useMutation","body","onSuccess","message","onError","err","aiMetadataJob","refetchAiMetadataJob","useAIMetadataJob","startGenerateAIMetadata","handleSubmit","e","preventDefault","handleChange","target","name","value","keys","Page","Loading","Main","tabIndex","Title","form","onSubmit","Layouts","Header","primaryAction","Button","loading","startIcon","fullWidth","subtitle","Content","direction","Box","background","padding","shadow","hasRadius","Grid","Item","col","xs","color","Sparkle","paddingTop","justifyContent","Field","minWidth","Toggle","checked","offLabel","onLabel","onChange","Boolean","totalImages","_Fragment","Divider","marginTop","marginBottom","hint","Label","responsiveDimensions","Hint","sizeOptimization","autoOrientation","ProtectedSettingsPage","Protect","permissions","PERMISSIONS","settings"],"mappings":"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"}
|