@strapi/i18n 0.0.0-experimental.7afdc9b682bc83a53ce599c4fb7c9e4506b31fff → 0.0.0-experimental.7b750d18de359d0a42233cb8707e3c31c5983345
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/LICENSE +18 -3
- package/dist/_chunks/{SettingsPage-DNucKxbi.mjs → SettingsPage-BIZrSFGY.mjs} +93 -106
- package/dist/_chunks/SettingsPage-BIZrSFGY.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-CG_qq0Tx.js → SettingsPage-kMDCxWLw.js} +91 -104
- package/dist/_chunks/SettingsPage-kMDCxWLw.js.map +1 -0
- package/dist/_chunks/{en-Kv6y9zPQ.js → en-B6327hMz.js} +10 -2
- package/dist/_chunks/en-B6327hMz.js.map +1 -0
- package/dist/_chunks/{en-18tWw4P6.mjs → en-DZXpOMHo.mjs} +10 -2
- package/dist/_chunks/en-DZXpOMHo.mjs.map +1 -0
- package/dist/_chunks/{index-BYDzOiHE.mjs → index-DXrgAtCA.mjs} +381 -191
- package/dist/_chunks/index-DXrgAtCA.mjs.map +1 -0
- package/dist/_chunks/{index-DWAqdQ--.js → index-Dncj9Inq.js} +387 -197
- package/dist/_chunks/index-Dncj9Inq.js.map +1 -0
- package/dist/admin/index.js +1 -1
- package/dist/admin/index.mjs +1 -1
- package/dist/admin/src/components/BulkLocaleActionModal.d.ts +2 -1
- package/dist/admin/src/components/CMHeaderActions.d.ts +27 -3
- package/dist/admin/src/components/EditLocale.d.ts +5 -4
- package/dist/admin/src/utils/clean.d.ts +4 -0
- package/dist/admin/src/utils/schemas.d.ts +1 -0
- package/dist/server/index.js +63 -98
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +64 -99
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/src/bootstrap.d.ts +1 -4
- package/dist/server/src/bootstrap.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +15 -13
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +14 -10
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/permissions/actions.d.ts +14 -2
- package/dist/server/src/services/permissions/actions.d.ts.map +1 -1
- package/dist/server/src/services/permissions.d.ts +14 -2
- package/dist/server/src/services/permissions.d.ts.map +1 -1
- package/dist/server/src/utils/index.d.ts +0 -2
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/package.json +9 -9
- package/dist/_chunks/SettingsPage-CG_qq0Tx.js.map +0 -1
- package/dist/_chunks/SettingsPage-DNucKxbi.mjs.map +0 -1
- package/dist/_chunks/en-18tWw4P6.mjs.map +0 -1
- package/dist/_chunks/en-Kv6y9zPQ.js.map +0 -1
- package/dist/_chunks/index-BYDzOiHE.mjs.map +0 -1
- package/dist/_chunks/index-DWAqdQ--.js.map +0 -1
- package/dist/admin/src/components/Initializer.d.ts +0 -5
- package/dist/server/src/services/entity-service-decorator.d.ts +0 -29
- package/dist/server/src/services/entity-service-decorator.d.ts.map +0 -1
- package/strapi-server.js +0 -3
@@ -1,12 +1,13 @@
|
|
1
1
|
import get from "lodash/get";
|
2
2
|
import * as yup from "yup";
|
3
|
-
import { jsxs,
|
3
|
+
import { jsxs, jsx, Fragment } from "react/jsx-runtime";
|
4
4
|
import * as React from "react";
|
5
|
-
import { Typography, Field, Checkbox,
|
6
|
-
import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, ListPlus, Earth, EarthStriked, CaretDown } from "@strapi/icons";
|
5
|
+
import { Typography, Dialog, Field, Checkbox, Flex, Button, Modal, Box, Status, IconButton, Tooltip, SingleSelect, SingleSelectOption, VisuallyHidden, useCollator, Popover } from "@strapi/design-system";
|
6
|
+
import { WarningCircle, Pencil, CrossCircle, CheckCircle, ArrowsCounterClockwise, Trash, Download, ListPlus, Cross, Earth, EarthStriked, CaretDown } from "@strapi/icons";
|
7
7
|
import { useIntl } from "react-intl";
|
8
8
|
import { styled } from "styled-components";
|
9
|
-
import {
|
9
|
+
import { skipToken } from "@reduxjs/toolkit/query";
|
10
|
+
import { useAuth, adminApi, useTable, Table, useQueryParams, useForm, useNotification, useAPIErrorHandler } from "@strapi/admin/strapi-admin";
|
10
11
|
import { unstable_useDocument, unstable_useDocumentActions, buildValidParams } from "@strapi/content-manager/strapi-admin";
|
11
12
|
import { useParams, Link, useNavigate, matchPath } from "react-router-dom";
|
12
13
|
import * as qs from "qs";
|
@@ -47,9 +48,7 @@ const CheckboxConfirmation = ({
|
|
47
48
|
};
|
48
49
|
const handleConfirm = () => {
|
49
50
|
onChange({ target: { name, value: false, type: "checkbox" } });
|
50
|
-
setIsOpen(false);
|
51
51
|
};
|
52
|
-
const handleToggle = () => setIsOpen((prev) => !prev);
|
53
52
|
const label = intlLabel.id ? formatMessage(
|
54
53
|
{ id: intlLabel.id, defaultMessage: intlLabel.defaultMessage },
|
55
54
|
{ ...intlLabel.values }
|
@@ -58,35 +57,36 @@ const CheckboxConfirmation = ({
|
|
58
57
|
{ id: description.id, defaultMessage: description.defaultMessage },
|
59
58
|
{ ...description.values }
|
60
59
|
) : "";
|
61
|
-
return /* @__PURE__ */ jsxs(
|
60
|
+
return /* @__PURE__ */ jsxs(Dialog.Root, { open: isOpen, onOpenChange: setIsOpen, children: [
|
62
61
|
/* @__PURE__ */ jsxs(Field.Root, { hint, name, children: [
|
63
|
-
/* @__PURE__ */ jsx(Checkbox, {
|
62
|
+
/* @__PURE__ */ jsx(Checkbox, { onCheckedChange: handleChange, checked: value, children: label }),
|
64
63
|
/* @__PURE__ */ jsx(Field.Hint, {})
|
65
64
|
] }),
|
66
|
-
|
67
|
-
/* @__PURE__ */ jsx(
|
68
|
-
|
65
|
+
/* @__PURE__ */ jsxs(Dialog.Content, { children: [
|
66
|
+
/* @__PURE__ */ jsx(Dialog.Header, { children: formatMessage({
|
67
|
+
id: getTranslation("CheckboxConfirmation.Modal.title"),
|
68
|
+
defaultMessage: "Disable localization"
|
69
|
+
}) }),
|
70
|
+
/* @__PURE__ */ jsx(Dialog.Body, { icon: /* @__PURE__ */ jsx(WarningCircle, {}), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "stretch", gap: 2, children: [
|
71
|
+
/* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(TextAlignTypography, { children: formatMessage({
|
69
72
|
id: getTranslation("CheckboxConfirmation.Modal.content"),
|
70
73
|
defaultMessage: "Disabling localization will engender the deletion of all your content but the one associated to your default locale (if existing)."
|
71
74
|
}) }) }),
|
72
|
-
/* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold",
|
75
|
+
/* @__PURE__ */ jsx(Flex, { justifyContent: "center", children: /* @__PURE__ */ jsx(Typography, { fontWeight: "semiBold", children: formatMessage({
|
73
76
|
id: getTranslation("CheckboxConfirmation.Modal.body"),
|
74
77
|
defaultMessage: "Do you want to disable it?"
|
75
78
|
}) }) })
|
76
79
|
] }) }),
|
77
|
-
/* @__PURE__ */
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
}) })
|
88
|
-
}
|
89
|
-
)
|
80
|
+
/* @__PURE__ */ jsxs(Dialog.Footer, { children: [
|
81
|
+
/* @__PURE__ */ jsx(Dialog.Cancel, { children: /* @__PURE__ */ jsx(Button, { variant: "tertiary", children: formatMessage({
|
82
|
+
id: "components.popUpWarning.button.cancel",
|
83
|
+
defaultMessage: "No, cancel"
|
84
|
+
}) }) }),
|
85
|
+
/* @__PURE__ */ jsx(Dialog.Action, { children: /* @__PURE__ */ jsx(Button, { variant: "danger-light", onClick: handleConfirm, children: formatMessage({
|
86
|
+
id: getTranslation("CheckboxConfirmation.Modal.button-confirm"),
|
87
|
+
defaultMessage: "Yes, disable"
|
88
|
+
}) }) })
|
89
|
+
] })
|
90
90
|
] })
|
91
91
|
] });
|
92
92
|
};
|
@@ -137,7 +137,7 @@ const useI18n = () => {
|
|
137
137
|
model: params.slug
|
138
138
|
},
|
139
139
|
{
|
140
|
-
skip:
|
140
|
+
skip: true
|
141
141
|
}
|
142
142
|
);
|
143
143
|
if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
|
@@ -217,10 +217,93 @@ const relationsApi = i18nApi.injectEndpoints({
|
|
217
217
|
})
|
218
218
|
});
|
219
219
|
const { useGetManyDraftRelationCountQuery } = relationsApi;
|
220
|
+
const cleanData = (data, schema, components) => {
|
221
|
+
const cleanedData = removeFields(data, [
|
222
|
+
"createdAt",
|
223
|
+
"createdBy",
|
224
|
+
"updatedAt",
|
225
|
+
"updatedBy",
|
226
|
+
"id",
|
227
|
+
"documentId",
|
228
|
+
"publishedAt",
|
229
|
+
"strapi_stage",
|
230
|
+
"strapi_assignee",
|
231
|
+
"locale"
|
232
|
+
]);
|
233
|
+
const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
|
234
|
+
cleanedData,
|
235
|
+
schema,
|
236
|
+
components,
|
237
|
+
["relation", "password"]
|
238
|
+
);
|
239
|
+
return cleanedDataWithoutPasswordAndRelation;
|
240
|
+
};
|
241
|
+
const removeFields = (data, fields) => {
|
242
|
+
return Object.keys(data).reduce((acc, current) => {
|
243
|
+
if (fields.includes(current)) {
|
244
|
+
return acc;
|
245
|
+
}
|
246
|
+
acc[current] = data[current];
|
247
|
+
return acc;
|
248
|
+
}, {});
|
249
|
+
};
|
250
|
+
const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
|
251
|
+
return Object.keys(data).reduce((acc, current) => {
|
252
|
+
const attribute = schema.attributes[current] ?? { type: void 0 };
|
253
|
+
if (fields.includes(attribute.type)) {
|
254
|
+
return acc;
|
255
|
+
}
|
256
|
+
if (attribute.type === "dynamiczone") {
|
257
|
+
acc[current] = data[current].map((componentValue, index2) => {
|
258
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
259
|
+
componentValue,
|
260
|
+
components[componentValue.__component],
|
261
|
+
components,
|
262
|
+
fields
|
263
|
+
);
|
264
|
+
return {
|
265
|
+
...rest,
|
266
|
+
__temp_key__: index2 + 1
|
267
|
+
};
|
268
|
+
});
|
269
|
+
} else if (attribute.type === "component") {
|
270
|
+
const { repeatable, component } = attribute;
|
271
|
+
if (repeatable) {
|
272
|
+
acc[current] = (data[current] ?? []).map((compoData, index2) => {
|
273
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
274
|
+
compoData,
|
275
|
+
components[component],
|
276
|
+
components,
|
277
|
+
fields
|
278
|
+
);
|
279
|
+
return {
|
280
|
+
...rest,
|
281
|
+
__temp_key__: index2 + 1
|
282
|
+
};
|
283
|
+
});
|
284
|
+
} else {
|
285
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
286
|
+
data[current] ?? {},
|
287
|
+
components[component],
|
288
|
+
components,
|
289
|
+
fields
|
290
|
+
);
|
291
|
+
acc[current] = rest;
|
292
|
+
}
|
293
|
+
} else {
|
294
|
+
acc[current] = data[current];
|
295
|
+
}
|
296
|
+
return acc;
|
297
|
+
}, {});
|
298
|
+
};
|
220
299
|
const isErrorMessageDescriptor = (object) => {
|
221
300
|
return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
|
222
301
|
};
|
223
|
-
const EntryValidationText = ({
|
302
|
+
const EntryValidationText = ({
|
303
|
+
status = "draft",
|
304
|
+
validationErrors,
|
305
|
+
action
|
306
|
+
}) => {
|
224
307
|
const { formatMessage } = useIntl();
|
225
308
|
const getErrorStr = (key, value) => {
|
226
309
|
if (typeof value === "string") {
|
@@ -254,30 +337,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
|
|
254
337
|
) })
|
255
338
|
] });
|
256
339
|
}
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
340
|
+
const getStatusMessage = () => {
|
341
|
+
if (action === "bulk-publish") {
|
342
|
+
if (status === "published") {
|
343
|
+
return {
|
344
|
+
icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
345
|
+
text: formatMessage({
|
346
|
+
id: "content-manager.bulk-publish.already-published",
|
347
|
+
defaultMessage: "Already Published"
|
348
|
+
}),
|
349
|
+
textColor: "success600",
|
350
|
+
fontWeight: "bold"
|
351
|
+
};
|
352
|
+
} else if (status === "modified") {
|
353
|
+
return {
|
354
|
+
icon: /* @__PURE__ */ jsx(ArrowsCounterClockwise, { fill: "alternative600" }),
|
355
|
+
text: formatMessage({
|
356
|
+
id: "app.utils.ready-to-publish-changes",
|
357
|
+
defaultMessage: "Ready to publish changes"
|
358
|
+
})
|
359
|
+
};
|
360
|
+
} else {
|
361
|
+
return {
|
362
|
+
icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
363
|
+
text: formatMessage({
|
364
|
+
id: "app.utils.ready-to-publish",
|
365
|
+
defaultMessage: "Ready to publish"
|
366
|
+
})
|
367
|
+
};
|
368
|
+
}
|
369
|
+
} else {
|
370
|
+
if (status === "draft") {
|
371
|
+
return {
|
372
|
+
icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
373
|
+
text: formatMessage({
|
374
|
+
id: "content-manager.bulk-unpublish.already-unpublished",
|
375
|
+
defaultMessage: "Already Unpublished"
|
376
|
+
}),
|
377
|
+
textColor: "success600",
|
378
|
+
fontWeight: "bold"
|
379
|
+
};
|
380
|
+
} else {
|
381
|
+
return {
|
382
|
+
icon: /* @__PURE__ */ jsx(CheckCircle, { fill: "success600" }),
|
383
|
+
text: formatMessage({
|
384
|
+
id: "app.utils.ready-to-unpublish-changes",
|
385
|
+
defaultMessage: "Ready to unpublish"
|
386
|
+
}),
|
387
|
+
textColor: "success600",
|
388
|
+
fontWeight: "bold"
|
389
|
+
};
|
390
|
+
}
|
391
|
+
}
|
392
|
+
};
|
393
|
+
const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
|
275
394
|
return /* @__PURE__ */ jsxs(Flex, { gap: 2, children: [
|
276
|
-
|
277
|
-
/* @__PURE__ */ jsx(Typography, { children:
|
278
|
-
id: "app.utils.ready-to-publish",
|
279
|
-
defaultMessage: "Ready to publish"
|
280
|
-
}) })
|
395
|
+
icon,
|
396
|
+
/* @__PURE__ */ jsx(Typography, { textColor, fontWeight, children: text })
|
281
397
|
] });
|
282
398
|
};
|
283
399
|
const BoldChunk = (chunks) => /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: chunks });
|
@@ -285,7 +401,8 @@ const BulkLocaleActionModal = ({
|
|
285
401
|
headers,
|
286
402
|
rows,
|
287
403
|
localesMetadata,
|
288
|
-
validationErrors = {}
|
404
|
+
validationErrors = {},
|
405
|
+
action
|
289
406
|
}) => {
|
290
407
|
const { formatMessage } = useIntl();
|
291
408
|
const selectedRows = useTable(
|
@@ -298,27 +415,29 @@ const BulkLocaleActionModal = ({
|
|
298
415
|
return acc;
|
299
416
|
}, {});
|
300
417
|
const localesWithErrors = Object.keys(validationErrors);
|
301
|
-
const
|
418
|
+
const publishedCount = selectedRows.filter(
|
302
419
|
({ locale }) => currentStatusByLocale[locale] === "published"
|
303
420
|
).length;
|
304
|
-
const
|
421
|
+
const draftCount = selectedRows.filter(
|
305
422
|
({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
|
306
423
|
).length;
|
307
424
|
const withErrorsCount = localesWithErrors.length;
|
425
|
+
const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
|
426
|
+
const defaultMessage = action === "bulk-publish" ? "<b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} already published. <b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} ready to publish. <b>{withErrorsCount}</b> {withErrorsCount, plural, =0 {entries} one {entry} other {entries}} waiting for action." : "<b>{draftCount}</b> {draftCount, plural, =0 {entries} one {entry} other {entries}} already unpublished. <b>{publishedCount}</b> {publishedCount, plural, =0 {entries} one {entry} other {entries}} ready to unpublish.";
|
308
427
|
return formatMessage(
|
309
428
|
{
|
310
|
-
id:
|
311
|
-
defaultMessage
|
429
|
+
id: messageId,
|
430
|
+
defaultMessage
|
312
431
|
},
|
313
432
|
{
|
314
433
|
withErrorsCount,
|
315
|
-
|
316
|
-
|
434
|
+
draftCount,
|
435
|
+
publishedCount,
|
317
436
|
b: BoldChunk
|
318
437
|
}
|
319
438
|
);
|
320
439
|
};
|
321
|
-
return /* @__PURE__ */ jsxs(
|
440
|
+
return /* @__PURE__ */ jsxs(Modal.Body, { children: [
|
322
441
|
/* @__PURE__ */ jsx(Typography, { children: getFormattedCountMessage() }),
|
323
442
|
/* @__PURE__ */ jsx(Box, { marginTop: 5, children: /* @__PURE__ */ jsxs(Table.Content, { children: [
|
324
443
|
/* @__PURE__ */ jsxs(Table.Head, { children: [
|
@@ -345,7 +464,7 @@ const BulkLocaleActionModal = ({
|
|
345
464
|
children: /* @__PURE__ */ jsx(Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
346
465
|
}
|
347
466
|
) }) }),
|
348
|
-
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status }) }),
|
467
|
+
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(EntryValidationText, { validationErrors: error, status, action }) }),
|
349
468
|
/* @__PURE__ */ jsx(Table.Cell, { children: /* @__PURE__ */ jsx(
|
350
469
|
IconButton,
|
351
470
|
{
|
@@ -362,7 +481,7 @@ const BulkLocaleActionModal = ({
|
|
362
481
|
name: locale
|
363
482
|
}
|
364
483
|
),
|
365
|
-
|
484
|
+
variant: "ghost",
|
366
485
|
children: /* @__PURE__ */ jsx(Pencil, {})
|
367
486
|
}
|
368
487
|
) })
|
@@ -382,7 +501,13 @@ const LocalePickerAction = ({
|
|
382
501
|
const [{ query }, setQuery] = useQueryParams();
|
383
502
|
const { hasI18n, canCreate, canRead } = useI18n();
|
384
503
|
const { data: locales = [] } = useGetLocalesQuery();
|
385
|
-
const
|
504
|
+
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
505
|
+
const { schema } = unstable_useDocument({
|
506
|
+
model,
|
507
|
+
collectionType,
|
508
|
+
documentId,
|
509
|
+
params: { locale: currentDesiredLocale }
|
510
|
+
});
|
386
511
|
const handleSelect = React.useCallback(
|
387
512
|
(value) => {
|
388
513
|
setQuery({
|
@@ -400,21 +525,20 @@ const LocalePickerAction = ({
|
|
400
525
|
if (!Array.isArray(locales) || !hasI18n) {
|
401
526
|
return;
|
402
527
|
}
|
403
|
-
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
404
528
|
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
|
405
529
|
const defaultLocale = locales.find((locale) => locale.isDefault);
|
406
530
|
if (!doesLocaleExist && defaultLocale?.code) {
|
407
531
|
handleSelect(defaultLocale.code);
|
408
532
|
}
|
409
|
-
}, [handleSelect, hasI18n, locales,
|
410
|
-
|
411
|
-
return null;
|
412
|
-
}
|
413
|
-
const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
|
533
|
+
}, [handleSelect, hasI18n, locales, currentDesiredLocale]);
|
534
|
+
const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale)?.code : void 0;
|
414
535
|
const allCurrentLocales = [
|
415
536
|
{ status: getDocumentStatus(document, meta), locale: currentLocale },
|
416
537
|
...meta?.availableLocales ?? []
|
417
538
|
];
|
539
|
+
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
540
|
+
return null;
|
541
|
+
}
|
418
542
|
return {
|
419
543
|
label: formatMessage({
|
420
544
|
id: getTranslation("Settings.locales.modal.locales.label"),
|
@@ -426,7 +550,7 @@ const LocalePickerAction = ({
|
|
426
550
|
);
|
427
551
|
const status = currentLocaleDoc?.status ?? "draft";
|
428
552
|
const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
|
429
|
-
const statusVariant = status === "draft" ? "
|
553
|
+
const statusVariant = status === "draft" ? "secondary" : status === "published" ? "success" : "alternative";
|
430
554
|
return {
|
431
555
|
disabled: !permissionsToCheck.includes(locale.code),
|
432
556
|
value: locale.code,
|
@@ -462,6 +586,95 @@ const getDocumentStatus = (document, meta) => {
|
|
462
586
|
}
|
463
587
|
return docStatus;
|
464
588
|
};
|
589
|
+
const FillFromAnotherLocaleAction = ({
|
590
|
+
documentId,
|
591
|
+
meta,
|
592
|
+
model,
|
593
|
+
collectionType
|
594
|
+
}) => {
|
595
|
+
const { formatMessage } = useIntl();
|
596
|
+
const [{ query }] = useQueryParams();
|
597
|
+
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
598
|
+
const [localeSelected, setLocaleSelected] = React.useState(null);
|
599
|
+
const setValues = useForm("FillFromAnotherLocale", (state) => state.setValues);
|
600
|
+
const { getDocument } = unstable_useDocumentActions();
|
601
|
+
const { schema, components } = unstable_useDocument({
|
602
|
+
model,
|
603
|
+
documentId,
|
604
|
+
collectionType,
|
605
|
+
params: { locale: currentDesiredLocale }
|
606
|
+
});
|
607
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
608
|
+
const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
|
609
|
+
const fillFromLocale = (onClose) => async () => {
|
610
|
+
const response = await getDocument({
|
611
|
+
collectionType,
|
612
|
+
model,
|
613
|
+
documentId,
|
614
|
+
params: { locale: localeSelected }
|
615
|
+
});
|
616
|
+
if (!response || !schema) {
|
617
|
+
return;
|
618
|
+
}
|
619
|
+
const { data } = response;
|
620
|
+
const cleanedData = cleanData(data, schema, components);
|
621
|
+
setValues(cleanedData);
|
622
|
+
onClose();
|
623
|
+
};
|
624
|
+
return {
|
625
|
+
type: "icon",
|
626
|
+
icon: /* @__PURE__ */ jsx(Download, {}),
|
627
|
+
disabled: availableLocales.length === 0,
|
628
|
+
label: formatMessage({
|
629
|
+
id: getTranslation("CMEditViewCopyLocale.copy-text"),
|
630
|
+
defaultMessage: "Fill in from another locale"
|
631
|
+
}),
|
632
|
+
dialog: {
|
633
|
+
type: "dialog",
|
634
|
+
title: formatMessage({
|
635
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.title"),
|
636
|
+
defaultMessage: "Confirmation"
|
637
|
+
}),
|
638
|
+
content: ({ onClose }) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
639
|
+
/* @__PURE__ */ jsx(Dialog.Body, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 3, children: [
|
640
|
+
/* @__PURE__ */ jsx(WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
|
641
|
+
/* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
|
642
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.body"),
|
643
|
+
defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
|
644
|
+
}) }),
|
645
|
+
/* @__PURE__ */ jsxs(Field.Root, { width: "100%", children: [
|
646
|
+
/* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
|
647
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
|
648
|
+
defaultMessage: "Locale"
|
649
|
+
}) }),
|
650
|
+
/* @__PURE__ */ jsx(
|
651
|
+
SingleSelect,
|
652
|
+
{
|
653
|
+
value: localeSelected,
|
654
|
+
placeholder: formatMessage({
|
655
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
|
656
|
+
defaultMessage: "Select one locale..."
|
657
|
+
}),
|
658
|
+
onChange: (value) => setLocaleSelected(value),
|
659
|
+
children: availableLocales.map((locale) => /* @__PURE__ */ jsx(SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
|
660
|
+
}
|
661
|
+
)
|
662
|
+
] })
|
663
|
+
] }) }),
|
664
|
+
/* @__PURE__ */ jsx(Dialog.Footer, { children: /* @__PURE__ */ jsxs(Flex, { gap: 2, width: "100%", children: [
|
665
|
+
/* @__PURE__ */ jsx(Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
|
666
|
+
id: getTranslation("CMEditViewCopyLocale.cancel-text"),
|
667
|
+
defaultMessage: "No, cancel"
|
668
|
+
}) }),
|
669
|
+
/* @__PURE__ */ jsx(Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
|
670
|
+
id: getTranslation("CMEditViewCopyLocale.submit-text"),
|
671
|
+
defaultMessage: "Yes, fill in"
|
672
|
+
}) })
|
673
|
+
] }) })
|
674
|
+
] })
|
675
|
+
}
|
676
|
+
};
|
677
|
+
};
|
465
678
|
const DeleteLocaleAction = ({
|
466
679
|
document,
|
467
680
|
documentId,
|
@@ -473,16 +686,23 @@ const DeleteLocaleAction = ({
|
|
473
686
|
const { toggleNotification } = useNotification();
|
474
687
|
const { delete: deleteAction } = unstable_useDocumentActions();
|
475
688
|
const { hasI18n, canDelete } = useI18n();
|
689
|
+
const [{ query }] = useQueryParams();
|
690
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
691
|
+
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
692
|
+
const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
|
476
693
|
if (!hasI18n) {
|
477
694
|
return null;
|
478
695
|
}
|
479
696
|
return {
|
480
697
|
disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
|
481
698
|
position: ["header", "table-row"],
|
482
|
-
label: formatMessage(
|
483
|
-
|
484
|
-
|
485
|
-
|
699
|
+
label: formatMessage(
|
700
|
+
{
|
701
|
+
id: getTranslation("actions.delete.label"),
|
702
|
+
defaultMessage: "Delete entry ({locale})"
|
703
|
+
},
|
704
|
+
{ locale: locale && locale.name }
|
705
|
+
),
|
486
706
|
icon: /* @__PURE__ */ jsx(StyledTrash, {}),
|
487
707
|
variant: "danger",
|
488
708
|
dialog: {
|
@@ -525,37 +745,43 @@ const DeleteLocaleAction = ({
|
|
525
745
|
}
|
526
746
|
};
|
527
747
|
};
|
528
|
-
const
|
748
|
+
const BulkLocaleAction = ({
|
529
749
|
document: baseDocument,
|
530
750
|
documentId,
|
531
751
|
model,
|
532
|
-
collectionType
|
752
|
+
collectionType,
|
753
|
+
action
|
533
754
|
}) => {
|
534
755
|
const baseLocale = baseDocument?.locale ?? null;
|
535
756
|
const [{ query }] = useQueryParams();
|
536
757
|
const params = React.useMemo(() => buildValidParams(query), [query]);
|
537
|
-
const
|
758
|
+
const isOnPublishedTab = query.status === "published";
|
538
759
|
const { formatMessage } = useIntl();
|
539
760
|
const { hasI18n, canPublish } = useI18n();
|
540
761
|
const { toggleNotification } = useNotification();
|
541
762
|
const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
|
542
763
|
const [selectedRows, setSelectedRows] = React.useState([]);
|
543
|
-
const [
|
544
|
-
const { publishMany: publishManyAction } = unstable_useDocumentActions();
|
764
|
+
const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React.useState(false);
|
765
|
+
const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = unstable_useDocumentActions();
|
545
766
|
const {
|
546
767
|
document,
|
547
768
|
meta: documentMeta,
|
548
769
|
schema,
|
549
770
|
validate
|
550
|
-
} = unstable_useDocument(
|
551
|
-
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
|
771
|
+
} = unstable_useDocument(
|
772
|
+
{
|
773
|
+
model,
|
774
|
+
collectionType,
|
775
|
+
documentId,
|
776
|
+
params: {
|
777
|
+
locale: baseLocale
|
778
|
+
}
|
779
|
+
},
|
780
|
+
{
|
781
|
+
skip: !hasI18n || !baseLocale
|
556
782
|
}
|
557
|
-
|
558
|
-
const { data: localesMetadata = [] } = useGetLocalesQuery();
|
783
|
+
);
|
784
|
+
const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : skipToken);
|
559
785
|
const headers = [
|
560
786
|
{
|
561
787
|
label: formatMessage({
|
@@ -604,12 +830,19 @@ const BulkLocalePublishAction = ({
|
|
604
830
|
}, {});
|
605
831
|
return [rowsFromMeta, errors];
|
606
832
|
}, [document, documentMeta?.availableLocales, validate]);
|
607
|
-
const
|
608
|
-
|
833
|
+
const isBulkPublish = action === "bulk-publish";
|
834
|
+
const localesForAction = selectedRows.reduce((acc, selectedRow) => {
|
835
|
+
const isValidLocale = (
|
836
|
+
// Validation errors are irrelevant if we are trying to unpublish
|
837
|
+
!isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
|
838
|
+
);
|
839
|
+
const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
|
840
|
+
if (shouldAddLocale) {
|
609
841
|
acc.push(selectedRow.locale);
|
610
842
|
}
|
611
843
|
return acc;
|
612
844
|
}, []);
|
845
|
+
const enableDraftRelationsCount = false;
|
613
846
|
const {
|
614
847
|
data: draftRelationsCount = 0,
|
615
848
|
isLoading: isDraftRelationsLoading,
|
@@ -618,10 +851,10 @@ const BulkLocalePublishAction = ({
|
|
618
851
|
{
|
619
852
|
model,
|
620
853
|
documentIds: [documentId],
|
621
|
-
locale:
|
854
|
+
locale: localesForAction
|
622
855
|
},
|
623
856
|
{
|
624
|
-
skip: !
|
857
|
+
skip: !enableDraftRelationsCount
|
625
858
|
}
|
626
859
|
);
|
627
860
|
React.useEffect(() => {
|
@@ -647,23 +880,32 @@ const BulkLocalePublishAction = ({
|
|
647
880
|
documentIds: [documentId],
|
648
881
|
params: {
|
649
882
|
...params,
|
650
|
-
locale:
|
883
|
+
locale: localesForAction
|
884
|
+
}
|
885
|
+
});
|
886
|
+
setSelectedRows([]);
|
887
|
+
};
|
888
|
+
const unpublish = async () => {
|
889
|
+
await unpublishManyAction({
|
890
|
+
model,
|
891
|
+
documentIds: [documentId],
|
892
|
+
params: {
|
893
|
+
...params,
|
894
|
+
locale: localesForAction
|
651
895
|
}
|
652
896
|
});
|
653
897
|
setSelectedRows([]);
|
654
898
|
};
|
655
899
|
const handleAction = async () => {
|
656
900
|
if (draftRelationsCount > 0) {
|
657
|
-
|
658
|
-
} else {
|
901
|
+
setIsDraftRelationConfirmationOpen(true);
|
902
|
+
} else if (isBulkPublish) {
|
659
903
|
await publish();
|
904
|
+
} else {
|
905
|
+
await unpublish();
|
660
906
|
}
|
661
907
|
};
|
662
|
-
|
663
|
-
if (isUnpublish) {
|
664
|
-
console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
|
665
|
-
}
|
666
|
-
if (isConfirmationOpen) {
|
908
|
+
if (isDraftRelationConfirmationOpen) {
|
667
909
|
return {
|
668
910
|
label: formatMessage({
|
669
911
|
id: "app.components.ConfirmDialog.title",
|
@@ -672,11 +914,11 @@ const BulkLocalePublishAction = ({
|
|
672
914
|
variant: "danger",
|
673
915
|
dialog: {
|
674
916
|
onCancel: () => {
|
675
|
-
|
917
|
+
setIsDraftRelationConfirmationOpen(false);
|
676
918
|
},
|
677
919
|
onConfirm: async () => {
|
678
920
|
await publish();
|
679
|
-
|
921
|
+
setIsDraftRelationConfirmationOpen(false);
|
680
922
|
},
|
681
923
|
type: "dialog",
|
682
924
|
title: formatMessage({
|
@@ -686,27 +928,32 @@ const BulkLocalePublishAction = ({
|
|
686
928
|
content: /* @__PURE__ */ jsxs(Flex, { direction: "column", alignItems: "center", gap: 2, children: [
|
687
929
|
/* @__PURE__ */ jsx(WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
|
688
930
|
/* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
|
689
|
-
id: "
|
690
|
-
defaultMessage: "
|
931
|
+
id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
|
932
|
+
defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
|
933
|
+
}) }),
|
934
|
+
/* @__PURE__ */ jsx(Typography, { textAlign: "center", children: formatMessage({
|
935
|
+
id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
|
936
|
+
defaultMessage: "Are you sure you want to continue?"
|
691
937
|
}) })
|
692
938
|
] })
|
693
939
|
}
|
694
940
|
};
|
695
941
|
}
|
942
|
+
const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
|
696
943
|
return {
|
697
944
|
label: formatMessage({
|
698
|
-
id: getTranslation("
|
699
|
-
defaultMessage: "Publish Multiple Locales
|
945
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
946
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
700
947
|
}),
|
701
|
-
|
702
|
-
|
948
|
+
variant: isBulkPublish ? "secondary" : "danger",
|
949
|
+
icon: isBulkPublish ? /* @__PURE__ */ jsx(ListPlus, {}) : /* @__PURE__ */ jsx(Cross, {}),
|
950
|
+
disabled: isOnPublishedTab || canPublish.length === 0,
|
703
951
|
position: ["panel"],
|
704
|
-
variant: "secondary",
|
705
952
|
dialog: {
|
706
953
|
type: "modal",
|
707
954
|
title: formatMessage({
|
708
|
-
id: getTranslation("
|
709
|
-
defaultMessage: "Publish Multiple Locales
|
955
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
956
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
710
957
|
}),
|
711
958
|
content: () => {
|
712
959
|
return /* @__PURE__ */ jsx(
|
@@ -725,28 +972,35 @@ const BulkLocalePublishAction = ({
|
|
725
972
|
validationErrors,
|
726
973
|
headers,
|
727
974
|
rows,
|
728
|
-
localesMetadata
|
975
|
+
localesMetadata,
|
976
|
+
action: action ?? "bulk-publish"
|
729
977
|
}
|
730
978
|
)
|
731
979
|
}
|
732
980
|
);
|
733
981
|
},
|
734
|
-
footer: () => /* @__PURE__ */ jsx(
|
735
|
-
Button
|
982
|
+
footer: () => /* @__PURE__ */ jsx(Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsx(
|
983
|
+
Button,
|
736
984
|
{
|
737
985
|
loading: isDraftRelationsLoading,
|
738
|
-
disabled:
|
986
|
+
disabled: !hasPermission || localesForAction.length === 0,
|
739
987
|
variant: "default",
|
740
988
|
onClick: handleAction,
|
741
989
|
children: formatMessage({
|
742
|
-
id: "app.utils.publish",
|
743
|
-
defaultMessage: "Publish"
|
990
|
+
id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
|
991
|
+
defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
|
744
992
|
})
|
745
993
|
}
|
746
994
|
) })
|
747
995
|
}
|
748
996
|
};
|
749
997
|
};
|
998
|
+
const BulkLocalePublishAction = (props) => {
|
999
|
+
return BulkLocaleAction({ action: "bulk-publish", ...props });
|
1000
|
+
};
|
1001
|
+
const BulkLocaleUnpublishAction = (props) => {
|
1002
|
+
return BulkLocaleAction({ action: "bulk-unpublish", ...props });
|
1003
|
+
};
|
750
1004
|
const StyledTrash = styled(Trash)`
|
751
1005
|
path {
|
752
1006
|
fill: currentColor;
|
@@ -803,13 +1057,6 @@ const UnpublishModalAdditionalInfo = () => {
|
|
803
1057
|
}
|
804
1058
|
) });
|
805
1059
|
};
|
806
|
-
const Initializer = ({ setPlugin }) => {
|
807
|
-
const setPluginRef = React.useRef(setPlugin);
|
808
|
-
React.useEffect(() => {
|
809
|
-
setPluginRef.current(pluginId);
|
810
|
-
}, []);
|
811
|
-
return null;
|
812
|
-
};
|
813
1060
|
const LocalePicker = () => {
|
814
1061
|
const { formatMessage } = useIntl();
|
815
1062
|
const [{ query }, setQuery] = useQueryParams();
|
@@ -869,7 +1116,7 @@ const PERMISSIONS = {
|
|
869
1116
|
read: [{ action: "plugin::i18n.locale.read", subject: null }]
|
870
1117
|
};
|
871
1118
|
const mutateEditViewHook = ({ layout }) => {
|
872
|
-
if ("i18n" in layout.options
|
1119
|
+
if (!("i18n" in layout.options) || typeof layout.options.i18n === "object" && layout.options.i18n !== null && "localized" in layout.options.i18n && !layout.options.i18n.localized) {
|
873
1120
|
return { layout };
|
874
1121
|
}
|
875
1122
|
const components = Object.entries(layout.components).reduce(
|
@@ -915,7 +1162,7 @@ const doesFieldHaveI18nPluginOpt = (pluginOpts) => {
|
|
915
1162
|
const LabelAction = ({ title, icon }) => {
|
916
1163
|
const { formatMessage } = useIntl();
|
917
1164
|
return /* @__PURE__ */ jsxs(Span, { tag: "span", children: [
|
918
|
-
/* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children:
|
1165
|
+
/* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: formatMessage(title) }),
|
919
1166
|
React.cloneElement(icon, {
|
920
1167
|
"aria-hidden": true,
|
921
1168
|
focusable: false
|
@@ -950,13 +1197,7 @@ const LocaleListCell = ({
|
|
950
1197
|
}
|
951
1198
|
});
|
952
1199
|
const { locale: language } = useIntl();
|
953
|
-
const [visible, setVisible] = React.useState(false);
|
954
|
-
const buttonRef = React.useRef(null);
|
955
1200
|
const { data: locales = [] } = useGetLocalesQuery();
|
956
|
-
const handleTogglePopover = (e) => {
|
957
|
-
e.stopPropagation();
|
958
|
-
setVisible((prev) => !prev);
|
959
|
-
};
|
960
1201
|
const formatter = useCollator(language, {
|
961
1202
|
sensitivity: "base"
|
962
1203
|
});
|
@@ -978,64 +1219,14 @@ const LocaleListCell = ({
|
|
978
1219
|
}
|
979
1220
|
return locale.name;
|
980
1221
|
}).toSorted((a, b) => formatter.compare(a, b));
|
981
|
-
return /* @__PURE__ */ jsxs(
|
982
|
-
/* @__PURE__ */ jsxs(
|
983
|
-
|
984
|
-
{
|
985
|
-
|
986
|
-
|
987
|
-
justifyContent: "center",
|
988
|
-
height: "3.2rem",
|
989
|
-
width: "3.2rem",
|
990
|
-
children: [
|
991
|
-
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
|
992
|
-
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, {}) })
|
993
|
-
]
|
994
|
-
}
|
995
|
-
),
|
996
|
-
visible && /* @__PURE__ */ jsx(
|
997
|
-
Popover,
|
998
|
-
{
|
999
|
-
onDismiss: () => setVisible(false),
|
1000
|
-
source: buttonRef,
|
1001
|
-
spacing: 16,
|
1002
|
-
centered: true,
|
1003
|
-
children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) })
|
1004
|
-
}
|
1005
|
-
)
|
1222
|
+
return /* @__PURE__ */ jsxs(Popover.Root, { children: [
|
1223
|
+
/* @__PURE__ */ jsx(Popover.Trigger, { children: /* @__PURE__ */ jsx(Button, { variant: "ghost", type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxs(Flex, { minWidth: "100%", alignItems: "center", justifyContent: "center", fontWeight: "regular", children: [
|
1224
|
+
/* @__PURE__ */ jsx(Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
|
1225
|
+
/* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(CaretDown, { width: "1.2rem", height: "1.2rem" }) })
|
1226
|
+
] }) }) }),
|
1227
|
+
/* @__PURE__ */ jsx(Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsx(Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsx(Typography, { children: name }) }, name)) }) })
|
1006
1228
|
] });
|
1007
1229
|
};
|
1008
|
-
const Button = styled.button`
|
1009
|
-
width: 100%;
|
1010
|
-
|
1011
|
-
svg {
|
1012
|
-
> g,
|
1013
|
-
path {
|
1014
|
-
fill: ${({ theme }) => theme.colors.neutral500};
|
1015
|
-
}
|
1016
|
-
}
|
1017
|
-
&:hover {
|
1018
|
-
svg {
|
1019
|
-
> g,
|
1020
|
-
path {
|
1021
|
-
fill: ${({ theme }) => theme.colors.neutral600};
|
1022
|
-
}
|
1023
|
-
}
|
1024
|
-
}
|
1025
|
-
&:active {
|
1026
|
-
svg {
|
1027
|
-
> g,
|
1028
|
-
path {
|
1029
|
-
fill: ${({ theme }) => theme.colors.neutral400};
|
1030
|
-
}
|
1031
|
-
}
|
1032
|
-
}
|
1033
|
-
`;
|
1034
|
-
const ActionWrapper = styled(Flex)`
|
1035
|
-
svg {
|
1036
|
-
height: 0.4rem;
|
1037
|
-
}
|
1038
|
-
`;
|
1039
1230
|
const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
1040
1231
|
const { options } = layout;
|
1041
1232
|
const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
|
@@ -1216,8 +1407,6 @@ const index = {
|
|
1216
1407
|
app.addRBACMiddleware([localeMiddleware]);
|
1217
1408
|
app.registerPlugin({
|
1218
1409
|
id: pluginId,
|
1219
|
-
initializer: Initializer,
|
1220
|
-
isReady: false,
|
1221
1410
|
name: pluginId
|
1222
1411
|
});
|
1223
1412
|
},
|
@@ -1235,11 +1424,11 @@ const index = {
|
|
1235
1424
|
},
|
1236
1425
|
id: "internationalization",
|
1237
1426
|
to: "internationalization",
|
1238
|
-
Component: () => import("./SettingsPage-
|
1427
|
+
Component: () => import("./SettingsPage-BIZrSFGY.mjs").then((mod) => ({ default: mod.ProtectedSettingsPage })),
|
1239
1428
|
permissions: PERMISSIONS.accessMain
|
1240
1429
|
});
|
1241
1430
|
const contentManager = app.getPlugin("content-manager");
|
1242
|
-
contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
|
1431
|
+
contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
|
1243
1432
|
contentManager.apis.addDocumentAction((actions) => {
|
1244
1433
|
const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
|
1245
1434
|
actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
|
@@ -1247,6 +1436,7 @@ const index = {
|
|
1247
1436
|
});
|
1248
1437
|
contentManager.apis.addDocumentAction((actions) => {
|
1249
1438
|
actions.splice(2, 0, BulkLocalePublishAction);
|
1439
|
+
actions.splice(5, 0, BulkLocaleUnpublishAction);
|
1250
1440
|
return actions;
|
1251
1441
|
});
|
1252
1442
|
contentManager.injectComponent("listView", "actions", {
|
@@ -1352,7 +1542,7 @@ const index = {
|
|
1352
1542
|
async registerTrads({ locales }) {
|
1353
1543
|
const importedTrads = await Promise.all(
|
1354
1544
|
locales.map((locale) => {
|
1355
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-
|
1545
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => import("./de-9eCAqqrB.mjs"), "./translations/dk.json": () => import("./dk-2qBjxt-P.mjs"), "./translations/en.json": () => import("./en-DZXpOMHo.mjs"), "./translations/es.json": () => import("./es-DlmMVaBG.mjs"), "./translations/fr.json": () => import("./fr-3S6ke71d.mjs"), "./translations/ko.json": () => import("./ko-qTjQ8IMw.mjs"), "./translations/pl.json": () => import("./pl-B67TSHqT.mjs"), "./translations/ru.json": () => import("./ru-hagMa57T.mjs"), "./translations/tr.json": () => import("./tr-Dw_jmkG-.mjs"), "./translations/zh-Hans.json": () => import("./zh-Hans-Dyc-aR-h.mjs"), "./translations/zh.json": () => import("./zh-57YM4amO.mjs") }), `./translations/${locale}.json`).then(({ default: data }) => {
|
1356
1546
|
return {
|
1357
1547
|
data: prefixPluginTranslations(data, pluginId),
|
1358
1548
|
locale
|
@@ -1378,4 +1568,4 @@ export {
|
|
1378
1568
|
index as i,
|
1379
1569
|
useCreateLocaleMutation as u
|
1380
1570
|
};
|
1381
|
-
//# sourceMappingURL=index-
|
1571
|
+
//# sourceMappingURL=index-DXrgAtCA.mjs.map
|