@strapi/i18n 0.0.0-experimental.d53e940834bf72ddc725f1d2fd36dac9abec30cb → 0.0.0-experimental.d6bba97c7ed8309e57888e84d4788fa279d473fd
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-w9zz705o.mjs → SettingsPage-BAx9nmep.mjs} +8 -8
- package/dist/_chunks/SettingsPage-BAx9nmep.mjs.map +1 -0
- package/dist/_chunks/{SettingsPage-CxZ9qSb_.js → SettingsPage-BTgjb2KS.js} +9 -10
- package/dist/_chunks/SettingsPage-BTgjb2KS.js.map +1 -0
- package/dist/_chunks/{en-BsOU9o5z.js → en-BKBz3tro.js} +10 -3
- package/dist/_chunks/en-BKBz3tro.js.map +1 -0
- package/dist/_chunks/{en-CM6Pjfyv.mjs → en-DlXfy6Gy.mjs} +10 -3
- package/dist/_chunks/en-DlXfy6Gy.mjs.map +1 -0
- package/dist/_chunks/{index-CLtneDAv.js → index-3yyF237r.js} +433 -187
- package/dist/_chunks/index-3yyF237r.js.map +1 -0
- package/dist/_chunks/{index-jbI6Njjb.mjs → index-B0NijiBB.mjs} +428 -181
- package/dist/_chunks/index-B0NijiBB.mjs.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 +29 -3
- package/dist/admin/src/components/CreateLocale.d.ts +6 -6
- package/dist/admin/src/contentReleasesHooks/releaseDetailsView.d.ts +9 -5
- 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 +414 -482
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +415 -482
- 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 +21 -13
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +20 -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/services/sanitize/index.d.ts +11 -0
- package/dist/server/src/services/sanitize/index.d.ts.map +1 -0
- package/dist/server/src/utils/index.d.ts +2 -2
- package/dist/server/src/utils/index.d.ts.map +1 -1
- package/package.json +13 -13
- package/dist/_chunks/SettingsPage-CxZ9qSb_.js.map +0 -1
- package/dist/_chunks/SettingsPage-w9zz705o.mjs.map +0 -1
- package/dist/_chunks/en-BsOU9o5z.js.map +0 -1
- package/dist/_chunks/en-CM6Pjfyv.mjs.map +0 -1
- package/dist/_chunks/index-CLtneDAv.js.map +0 -1
- package/dist/_chunks/index-jbI6Njjb.mjs.map +0 -1
- package/dist/admin/src/components/Initializer.d.ts +0 -5
- package/dist/server/src/migrations/content-type/disable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/disable/index.d.ts.map +0 -1
- package/dist/server/src/migrations/content-type/enable/index.d.ts +0 -3
- package/dist/server/src/migrations/content-type/enable/index.d.ts.map +0 -1
- 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
@@ -7,6 +7,7 @@ const designSystem = require("@strapi/design-system");
|
|
7
7
|
const icons = require("@strapi/icons");
|
8
8
|
const reactIntl = require("react-intl");
|
9
9
|
const styledComponents = require("styled-components");
|
10
|
+
const query = require("@reduxjs/toolkit/query");
|
10
11
|
const strapiAdmin = require("@strapi/admin/strapi-admin");
|
11
12
|
const strapiAdmin$1 = require("@strapi/content-manager/strapi-admin");
|
12
13
|
const reactRouterDom = require("react-router-dom");
|
@@ -14,8 +15,7 @@ const qs = require("qs");
|
|
14
15
|
const omit = require("lodash/omit");
|
15
16
|
const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
|
16
17
|
function _interopNamespace(e) {
|
17
|
-
if (e && e.__esModule)
|
18
|
-
return e;
|
18
|
+
if (e && e.__esModule) return e;
|
19
19
|
const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
|
20
20
|
if (e) {
|
21
21
|
for (const k in e) {
|
@@ -36,13 +36,20 @@ const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
|
|
36
36
|
const React__namespace = /* @__PURE__ */ _interopNamespace(React);
|
37
37
|
const qs__namespace = /* @__PURE__ */ _interopNamespace(qs);
|
38
38
|
const omit__default = /* @__PURE__ */ _interopDefault(omit);
|
39
|
-
const __variableDynamicImportRuntimeHelper = (glob, path) => {
|
39
|
+
const __variableDynamicImportRuntimeHelper = (glob, path, segs) => {
|
40
40
|
const v = glob[path];
|
41
41
|
if (v) {
|
42
42
|
return typeof v === "function" ? v() : Promise.resolve(v);
|
43
43
|
}
|
44
44
|
return new Promise((_, reject) => {
|
45
|
-
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
45
|
+
(typeof queueMicrotask === "function" ? queueMicrotask : setTimeout)(
|
46
|
+
reject.bind(
|
47
|
+
null,
|
48
|
+
new Error(
|
49
|
+
"Unknown variable dynamic import: " + path + (path.split("/").length !== segs ? ". Note that variables only represent file names one level deep." : "")
|
50
|
+
)
|
51
|
+
)
|
52
|
+
);
|
46
53
|
});
|
47
54
|
};
|
48
55
|
const pluginId = "i18n";
|
@@ -160,7 +167,7 @@ const useI18n = () => {
|
|
160
167
|
model: params.slug
|
161
168
|
},
|
162
169
|
{
|
163
|
-
skip:
|
170
|
+
skip: true
|
164
171
|
}
|
165
172
|
);
|
166
173
|
if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
|
@@ -240,10 +247,94 @@ const relationsApi = i18nApi.injectEndpoints({
|
|
240
247
|
})
|
241
248
|
});
|
242
249
|
const { useGetManyDraftRelationCountQuery } = relationsApi;
|
250
|
+
const cleanData = (data, schema, components) => {
|
251
|
+
const cleanedData = removeFields(data, [
|
252
|
+
"createdAt",
|
253
|
+
"createdBy",
|
254
|
+
"updatedAt",
|
255
|
+
"updatedBy",
|
256
|
+
"id",
|
257
|
+
"documentId",
|
258
|
+
"publishedAt",
|
259
|
+
"strapi_stage",
|
260
|
+
"strapi_assignee",
|
261
|
+
"locale",
|
262
|
+
"status"
|
263
|
+
]);
|
264
|
+
const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
|
265
|
+
cleanedData,
|
266
|
+
schema,
|
267
|
+
components,
|
268
|
+
["relation", "password"]
|
269
|
+
);
|
270
|
+
return cleanedDataWithoutPasswordAndRelation;
|
271
|
+
};
|
272
|
+
const removeFields = (data, fields) => {
|
273
|
+
return Object.keys(data).reduce((acc, current) => {
|
274
|
+
if (fields.includes(current)) {
|
275
|
+
return acc;
|
276
|
+
}
|
277
|
+
acc[current] = data[current];
|
278
|
+
return acc;
|
279
|
+
}, {});
|
280
|
+
};
|
281
|
+
const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
|
282
|
+
return Object.keys(data).reduce((acc, current) => {
|
283
|
+
const attribute = schema.attributes[current] ?? { type: void 0 };
|
284
|
+
if (fields.includes(attribute.type)) {
|
285
|
+
return acc;
|
286
|
+
}
|
287
|
+
if (attribute.type === "dynamiczone") {
|
288
|
+
acc[current] = data[current].map((componentValue, index2) => {
|
289
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
290
|
+
componentValue,
|
291
|
+
components[componentValue.__component],
|
292
|
+
components,
|
293
|
+
fields
|
294
|
+
);
|
295
|
+
return {
|
296
|
+
...rest,
|
297
|
+
__temp_key__: index2 + 1
|
298
|
+
};
|
299
|
+
});
|
300
|
+
} else if (attribute.type === "component") {
|
301
|
+
const { repeatable, component } = attribute;
|
302
|
+
if (repeatable) {
|
303
|
+
acc[current] = (data[current] ?? []).map((compoData, index2) => {
|
304
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
305
|
+
compoData,
|
306
|
+
components[component],
|
307
|
+
components,
|
308
|
+
fields
|
309
|
+
);
|
310
|
+
return {
|
311
|
+
...rest,
|
312
|
+
__temp_key__: index2 + 1
|
313
|
+
};
|
314
|
+
});
|
315
|
+
} else {
|
316
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
317
|
+
data[current] ?? {},
|
318
|
+
components[component],
|
319
|
+
components,
|
320
|
+
fields
|
321
|
+
);
|
322
|
+
acc[current] = rest;
|
323
|
+
}
|
324
|
+
} else {
|
325
|
+
acc[current] = data[current];
|
326
|
+
}
|
327
|
+
return acc;
|
328
|
+
}, {});
|
329
|
+
};
|
243
330
|
const isErrorMessageDescriptor = (object) => {
|
244
331
|
return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
|
245
332
|
};
|
246
|
-
const EntryValidationText = ({
|
333
|
+
const EntryValidationText = ({
|
334
|
+
status = "draft",
|
335
|
+
validationErrors,
|
336
|
+
action
|
337
|
+
}) => {
|
247
338
|
const { formatMessage } = reactIntl.useIntl();
|
248
339
|
const getErrorStr = (key, value) => {
|
249
340
|
if (typeof value === "string") {
|
@@ -277,30 +368,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
|
|
277
368
|
) })
|
278
369
|
] });
|
279
370
|
}
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
371
|
+
const getStatusMessage = () => {
|
372
|
+
if (action === "bulk-publish") {
|
373
|
+
if (status === "published") {
|
374
|
+
return {
|
375
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
376
|
+
text: formatMessage({
|
377
|
+
id: "content-manager.bulk-publish.already-published",
|
378
|
+
defaultMessage: "Already Published"
|
379
|
+
}),
|
380
|
+
textColor: "success600",
|
381
|
+
fontWeight: "bold"
|
382
|
+
};
|
383
|
+
} else if (status === "modified") {
|
384
|
+
return {
|
385
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
|
386
|
+
text: formatMessage({
|
387
|
+
id: "app.utils.ready-to-publish-changes",
|
388
|
+
defaultMessage: "Ready to publish changes"
|
389
|
+
})
|
390
|
+
};
|
391
|
+
} else {
|
392
|
+
return {
|
393
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
394
|
+
text: formatMessage({
|
395
|
+
id: "app.utils.ready-to-publish",
|
396
|
+
defaultMessage: "Ready to publish"
|
397
|
+
})
|
398
|
+
};
|
399
|
+
}
|
400
|
+
} else {
|
401
|
+
if (status === "draft") {
|
402
|
+
return {
|
403
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
404
|
+
text: formatMessage({
|
405
|
+
id: "content-manager.bulk-unpublish.already-unpublished",
|
406
|
+
defaultMessage: "Already Unpublished"
|
407
|
+
}),
|
408
|
+
textColor: "success600",
|
409
|
+
fontWeight: "bold"
|
410
|
+
};
|
411
|
+
} else {
|
412
|
+
return {
|
413
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
414
|
+
text: formatMessage({
|
415
|
+
id: "app.utils.ready-to-unpublish-changes",
|
416
|
+
defaultMessage: "Ready to unpublish"
|
417
|
+
}),
|
418
|
+
textColor: "success600",
|
419
|
+
fontWeight: "bold"
|
420
|
+
};
|
421
|
+
}
|
422
|
+
}
|
423
|
+
};
|
424
|
+
const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
|
298
425
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, children: [
|
299
|
-
|
300
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children:
|
301
|
-
id: "app.utils.ready-to-publish",
|
302
|
-
defaultMessage: "Ready to publish"
|
303
|
-
}) })
|
426
|
+
icon,
|
427
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor, fontWeight, children: text })
|
304
428
|
] });
|
305
429
|
};
|
306
430
|
const BoldChunk = (chunks) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: chunks });
|
@@ -308,7 +432,8 @@ const BulkLocaleActionModal = ({
|
|
308
432
|
headers,
|
309
433
|
rows,
|
310
434
|
localesMetadata,
|
311
|
-
validationErrors = {}
|
435
|
+
validationErrors = {},
|
436
|
+
action
|
312
437
|
}) => {
|
313
438
|
const { formatMessage } = reactIntl.useIntl();
|
314
439
|
const selectedRows = strapiAdmin.useTable(
|
@@ -321,27 +446,29 @@ const BulkLocaleActionModal = ({
|
|
321
446
|
return acc;
|
322
447
|
}, {});
|
323
448
|
const localesWithErrors = Object.keys(validationErrors);
|
324
|
-
const
|
449
|
+
const publishedCount = selectedRows.filter(
|
325
450
|
({ locale }) => currentStatusByLocale[locale] === "published"
|
326
451
|
).length;
|
327
|
-
const
|
452
|
+
const draftCount = selectedRows.filter(
|
328
453
|
({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
|
329
454
|
).length;
|
330
455
|
const withErrorsCount = localesWithErrors.length;
|
456
|
+
const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
|
457
|
+
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.";
|
331
458
|
return formatMessage(
|
332
459
|
{
|
333
|
-
id:
|
334
|
-
defaultMessage
|
460
|
+
id: messageId,
|
461
|
+
defaultMessage
|
335
462
|
},
|
336
463
|
{
|
337
464
|
withErrorsCount,
|
338
|
-
|
339
|
-
|
465
|
+
draftCount,
|
466
|
+
publishedCount,
|
340
467
|
b: BoldChunk
|
341
468
|
}
|
342
469
|
);
|
343
470
|
};
|
344
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
471
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Body, { children: [
|
345
472
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: getFormattedCountMessage() }),
|
346
473
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 5, children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
|
347
474
|
/* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
|
@@ -362,13 +489,12 @@ const BulkLocaleActionModal = ({
|
|
362
489
|
paddingRight: "6px",
|
363
490
|
paddingTop: "2px",
|
364
491
|
paddingBottom: "2px",
|
365
|
-
showBullet: false,
|
366
492
|
size: "S",
|
367
493
|
variant: statusVariant,
|
368
494
|
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
369
495
|
}
|
370
496
|
) }) }),
|
371
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status }) }),
|
497
|
+
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status, action }) }),
|
372
498
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
373
499
|
designSystem.IconButton,
|
374
500
|
{
|
@@ -385,7 +511,7 @@ const BulkLocaleActionModal = ({
|
|
385
511
|
name: locale
|
386
512
|
}
|
387
513
|
),
|
388
|
-
|
514
|
+
variant: "ghost",
|
389
515
|
children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
|
390
516
|
}
|
391
517
|
) })
|
@@ -394,6 +520,47 @@ const BulkLocaleActionModal = ({
|
|
394
520
|
] }) })
|
395
521
|
] });
|
396
522
|
};
|
523
|
+
const statusVariants = {
|
524
|
+
draft: "secondary",
|
525
|
+
published: "success",
|
526
|
+
modified: "alternative"
|
527
|
+
};
|
528
|
+
const LocaleOption = ({
|
529
|
+
isDraftAndPublishEnabled,
|
530
|
+
locale,
|
531
|
+
status,
|
532
|
+
entryExists
|
533
|
+
}) => {
|
534
|
+
const { formatMessage } = reactIntl.useIntl();
|
535
|
+
if (!entryExists) {
|
536
|
+
return formatMessage(
|
537
|
+
{
|
538
|
+
id: getTranslation("CMEditViewLocalePicker.locale.create"),
|
539
|
+
defaultMessage: "Create <bold>{locale}</bold> locale"
|
540
|
+
},
|
541
|
+
{
|
542
|
+
bold: (locale2) => /* @__PURE__ */ jsxRuntime.jsx("b", { children: locale2 }),
|
543
|
+
locale: locale.name
|
544
|
+
}
|
545
|
+
);
|
546
|
+
}
|
547
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
|
548
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: locale.name }),
|
549
|
+
isDraftAndPublishEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
|
550
|
+
designSystem.Status,
|
551
|
+
{
|
552
|
+
display: "flex",
|
553
|
+
paddingLeft: "6px",
|
554
|
+
paddingRight: "6px",
|
555
|
+
paddingTop: "2px",
|
556
|
+
paddingBottom: "2px",
|
557
|
+
size: "S",
|
558
|
+
variant: statusVariants[status],
|
559
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
560
|
+
}
|
561
|
+
) : null
|
562
|
+
] });
|
563
|
+
};
|
397
564
|
const LocalePickerAction = ({
|
398
565
|
document,
|
399
566
|
meta,
|
@@ -402,74 +569,77 @@ const LocalePickerAction = ({
|
|
402
569
|
documentId
|
403
570
|
}) => {
|
404
571
|
const { formatMessage } = reactIntl.useIntl();
|
405
|
-
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
572
|
+
const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
|
406
573
|
const { hasI18n, canCreate, canRead } = useI18n();
|
407
574
|
const { data: locales = [] } = useGetLocalesQuery();
|
408
|
-
const
|
575
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
576
|
+
const { schema } = strapiAdmin$1.unstable_useDocument({
|
577
|
+
model,
|
578
|
+
collectionType,
|
579
|
+
documentId,
|
580
|
+
params: { locale: currentDesiredLocale }
|
581
|
+
});
|
409
582
|
const handleSelect = React__namespace.useCallback(
|
410
583
|
(value) => {
|
411
584
|
setQuery({
|
412
585
|
plugins: {
|
413
|
-
...
|
586
|
+
...query2.plugins,
|
414
587
|
i18n: {
|
415
588
|
locale: value
|
416
589
|
}
|
417
590
|
}
|
418
591
|
});
|
419
592
|
},
|
420
|
-
[
|
593
|
+
[query2.plugins, setQuery]
|
421
594
|
);
|
422
595
|
React__namespace.useEffect(() => {
|
423
596
|
if (!Array.isArray(locales) || !hasI18n) {
|
424
597
|
return;
|
425
598
|
}
|
426
|
-
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
427
599
|
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
|
428
600
|
const defaultLocale = locales.find((locale) => locale.isDefault);
|
429
601
|
if (!doesLocaleExist && defaultLocale?.code) {
|
430
602
|
handleSelect(defaultLocale.code);
|
431
603
|
}
|
432
|
-
}, [handleSelect, hasI18n, locales,
|
433
|
-
|
434
|
-
return null;
|
435
|
-
}
|
436
|
-
const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
|
604
|
+
}, [handleSelect, hasI18n, locales, currentDesiredLocale]);
|
605
|
+
const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
|
437
606
|
const allCurrentLocales = [
|
438
|
-
{ status: getDocumentStatus(document, meta), locale: currentLocale },
|
607
|
+
{ status: getDocumentStatus(document, meta), locale: currentLocale?.code },
|
439
608
|
...meta?.availableLocales ?? []
|
440
609
|
];
|
610
|
+
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
611
|
+
return null;
|
612
|
+
}
|
613
|
+
const displayedLocales = locales.filter((locale) => {
|
614
|
+
return canRead.includes(locale.code);
|
615
|
+
});
|
441
616
|
return {
|
442
617
|
label: formatMessage({
|
443
618
|
id: getTranslation("Settings.locales.modal.locales.label"),
|
444
619
|
defaultMessage: "Locales"
|
445
620
|
}),
|
446
|
-
options:
|
621
|
+
options: displayedLocales.map((locale) => {
|
622
|
+
const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
|
447
623
|
const currentLocaleDoc = allCurrentLocales.find(
|
448
624
|
(doc) => "locale" in doc ? doc.locale === locale.code : false
|
449
625
|
);
|
450
|
-
const
|
451
|
-
const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
|
452
|
-
const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
|
626
|
+
const permissionsToCheck = currentLocaleDoc ? canRead : canCreate;
|
453
627
|
return {
|
454
628
|
disabled: !permissionsToCheck.includes(locale.code),
|
455
629
|
value: locale.code,
|
456
|
-
label:
|
457
|
-
|
458
|
-
designSystem.Status,
|
630
|
+
label: /* @__PURE__ */ jsxRuntime.jsx(
|
631
|
+
LocaleOption,
|
459
632
|
{
|
460
|
-
|
461
|
-
|
462
|
-
|
463
|
-
|
464
|
-
paddingBottom: "2px",
|
465
|
-
showBullet: false,
|
466
|
-
size: "S",
|
467
|
-
variant: statusVariant,
|
468
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
633
|
+
isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
|
634
|
+
locale,
|
635
|
+
status: currentLocaleDoc?.status,
|
636
|
+
entryExists: entryWithLocaleExists
|
469
637
|
}
|
470
|
-
)
|
638
|
+
),
|
639
|
+
startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) : null
|
471
640
|
};
|
472
641
|
}),
|
642
|
+
customizeContent: () => currentLocale?.name,
|
473
643
|
onSelect: handleSelect,
|
474
644
|
value: currentLocale
|
475
645
|
};
|
@@ -485,6 +655,99 @@ const getDocumentStatus = (document, meta) => {
|
|
485
655
|
}
|
486
656
|
return docStatus;
|
487
657
|
};
|
658
|
+
const FillFromAnotherLocaleAction = ({
|
659
|
+
documentId,
|
660
|
+
meta,
|
661
|
+
model,
|
662
|
+
collectionType
|
663
|
+
}) => {
|
664
|
+
const { formatMessage } = reactIntl.useIntl();
|
665
|
+
const [{ query: query2 }] = strapiAdmin.useQueryParams();
|
666
|
+
const { hasI18n } = useI18n();
|
667
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
668
|
+
const [localeSelected, setLocaleSelected] = React__namespace.useState(null);
|
669
|
+
const setValues = strapiAdmin.useForm("FillFromAnotherLocale", (state) => state.setValues);
|
670
|
+
const { getDocument } = strapiAdmin$1.unstable_useDocumentActions();
|
671
|
+
const { schema, components } = strapiAdmin$1.unstable_useDocument({
|
672
|
+
model,
|
673
|
+
documentId,
|
674
|
+
collectionType,
|
675
|
+
params: { locale: currentDesiredLocale }
|
676
|
+
});
|
677
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
678
|
+
const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
|
679
|
+
const fillFromLocale = (onClose) => async () => {
|
680
|
+
const response = await getDocument({
|
681
|
+
collectionType,
|
682
|
+
model,
|
683
|
+
documentId,
|
684
|
+
params: { locale: localeSelected }
|
685
|
+
});
|
686
|
+
if (!response || !schema) {
|
687
|
+
return;
|
688
|
+
}
|
689
|
+
const { data } = response;
|
690
|
+
const cleanedData = cleanData(data, schema, components);
|
691
|
+
setValues(cleanedData);
|
692
|
+
onClose();
|
693
|
+
};
|
694
|
+
if (!hasI18n) {
|
695
|
+
return null;
|
696
|
+
}
|
697
|
+
return {
|
698
|
+
type: "icon",
|
699
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
|
700
|
+
disabled: availableLocales.length === 0,
|
701
|
+
label: formatMessage({
|
702
|
+
id: getTranslation("CMEditViewCopyLocale.copy-text"),
|
703
|
+
defaultMessage: "Fill in from another locale"
|
704
|
+
}),
|
705
|
+
dialog: {
|
706
|
+
type: "dialog",
|
707
|
+
title: formatMessage({
|
708
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.title"),
|
709
|
+
defaultMessage: "Confirmation"
|
710
|
+
}),
|
711
|
+
content: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
712
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, children: [
|
713
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
|
714
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
|
715
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.body"),
|
716
|
+
defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
|
717
|
+
}) }),
|
718
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { width: "100%", children: [
|
719
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
|
720
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
|
721
|
+
defaultMessage: "Locale"
|
722
|
+
}) }),
|
723
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
724
|
+
designSystem.SingleSelect,
|
725
|
+
{
|
726
|
+
value: localeSelected,
|
727
|
+
placeholder: formatMessage({
|
728
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
|
729
|
+
defaultMessage: "Select one locale..."
|
730
|
+
}),
|
731
|
+
onChange: (value) => setLocaleSelected(value),
|
732
|
+
children: availableLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
|
733
|
+
}
|
734
|
+
)
|
735
|
+
] })
|
736
|
+
] }) }),
|
737
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
|
738
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
|
739
|
+
id: getTranslation("CMEditViewCopyLocale.cancel-text"),
|
740
|
+
defaultMessage: "No, cancel"
|
741
|
+
}) }),
|
742
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
|
743
|
+
id: getTranslation("CMEditViewCopyLocale.submit-text"),
|
744
|
+
defaultMessage: "Yes, fill in"
|
745
|
+
}) })
|
746
|
+
] }) })
|
747
|
+
] })
|
748
|
+
}
|
749
|
+
};
|
750
|
+
};
|
488
751
|
const DeleteLocaleAction = ({
|
489
752
|
document,
|
490
753
|
documentId,
|
@@ -496,16 +759,23 @@ const DeleteLocaleAction = ({
|
|
496
759
|
const { toggleNotification } = strapiAdmin.useNotification();
|
497
760
|
const { delete: deleteAction } = strapiAdmin$1.unstable_useDocumentActions();
|
498
761
|
const { hasI18n, canDelete } = useI18n();
|
762
|
+
const [{ query: query2 }] = strapiAdmin.useQueryParams();
|
763
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
764
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
765
|
+
const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
|
499
766
|
if (!hasI18n) {
|
500
767
|
return null;
|
501
768
|
}
|
502
769
|
return {
|
503
770
|
disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
|
504
771
|
position: ["header", "table-row"],
|
505
|
-
label: formatMessage(
|
506
|
-
|
507
|
-
|
508
|
-
|
772
|
+
label: formatMessage(
|
773
|
+
{
|
774
|
+
id: getTranslation("actions.delete.label"),
|
775
|
+
defaultMessage: "Delete entry ({locale})"
|
776
|
+
},
|
777
|
+
{ locale: locale && locale.name }
|
778
|
+
),
|
509
779
|
icon: /* @__PURE__ */ jsxRuntime.jsx(StyledTrash, {}),
|
510
780
|
variant: "danger",
|
511
781
|
dialog: {
|
@@ -522,7 +792,12 @@ const DeleteLocaleAction = ({
|
|
522
792
|
}) })
|
523
793
|
] }),
|
524
794
|
onConfirm: async () => {
|
525
|
-
|
795
|
+
const unableToDelete = (
|
796
|
+
// We are unable to delete a collection type without a document ID
|
797
|
+
// & unable to delete generally if there is no document locale
|
798
|
+
collectionType !== "single-types" && !documentId || !document?.locale
|
799
|
+
);
|
800
|
+
if (unableToDelete) {
|
526
801
|
console.error(
|
527
802
|
"You're trying to delete a document without an id or locale, this is likely a bug with Strapi. Please open an issue."
|
528
803
|
);
|
@@ -548,37 +823,43 @@ const DeleteLocaleAction = ({
|
|
548
823
|
}
|
549
824
|
};
|
550
825
|
};
|
551
|
-
const
|
826
|
+
const BulkLocaleAction = ({
|
552
827
|
document: baseDocument,
|
553
828
|
documentId,
|
554
829
|
model,
|
555
|
-
collectionType
|
830
|
+
collectionType,
|
831
|
+
action
|
556
832
|
}) => {
|
557
833
|
const baseLocale = baseDocument?.locale ?? null;
|
558
|
-
const [{ query }] = strapiAdmin.useQueryParams();
|
559
|
-
const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query), [query]);
|
560
|
-
const
|
834
|
+
const [{ query: query$1 }] = strapiAdmin.useQueryParams();
|
835
|
+
const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
|
836
|
+
const isOnPublishedTab = query$1.status === "published";
|
561
837
|
const { formatMessage } = reactIntl.useIntl();
|
562
838
|
const { hasI18n, canPublish } = useI18n();
|
563
839
|
const { toggleNotification } = strapiAdmin.useNotification();
|
564
840
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
565
841
|
const [selectedRows, setSelectedRows] = React__namespace.useState([]);
|
566
842
|
const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
|
567
|
-
const { publishMany: publishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
|
843
|
+
const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
|
568
844
|
const {
|
569
845
|
document,
|
570
846
|
meta: documentMeta,
|
571
847
|
schema,
|
572
848
|
validate
|
573
|
-
} = strapiAdmin$1.unstable_useDocument(
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
849
|
+
} = strapiAdmin$1.unstable_useDocument(
|
850
|
+
{
|
851
|
+
model,
|
852
|
+
collectionType,
|
853
|
+
documentId,
|
854
|
+
params: {
|
855
|
+
locale: baseLocale
|
856
|
+
}
|
857
|
+
},
|
858
|
+
{
|
859
|
+
skip: !hasI18n || !baseLocale
|
579
860
|
}
|
580
|
-
|
581
|
-
const { data: localesMetadata = [] } = useGetLocalesQuery();
|
861
|
+
);
|
862
|
+
const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
|
582
863
|
const headers = [
|
583
864
|
{
|
584
865
|
label: formatMessage({
|
@@ -627,12 +908,19 @@ const BulkLocalePublishAction = ({
|
|
627
908
|
}, {});
|
628
909
|
return [rowsFromMeta, errors];
|
629
910
|
}, [document, documentMeta?.availableLocales, validate]);
|
630
|
-
const
|
631
|
-
|
911
|
+
const isBulkPublish = action === "bulk-publish";
|
912
|
+
const localesForAction = selectedRows.reduce((acc, selectedRow) => {
|
913
|
+
const isValidLocale = (
|
914
|
+
// Validation errors are irrelevant if we are trying to unpublish
|
915
|
+
!isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
|
916
|
+
);
|
917
|
+
const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
|
918
|
+
if (shouldAddLocale) {
|
632
919
|
acc.push(selectedRow.locale);
|
633
920
|
}
|
634
921
|
return acc;
|
635
922
|
}, []);
|
923
|
+
const enableDraftRelationsCount = false;
|
636
924
|
const {
|
637
925
|
data: draftRelationsCount = 0,
|
638
926
|
isLoading: isDraftRelationsLoading,
|
@@ -641,10 +929,10 @@ const BulkLocalePublishAction = ({
|
|
641
929
|
{
|
642
930
|
model,
|
643
931
|
documentIds: [documentId],
|
644
|
-
locale:
|
932
|
+
locale: localesForAction
|
645
933
|
},
|
646
934
|
{
|
647
|
-
skip: !
|
935
|
+
skip: !enableDraftRelationsCount
|
648
936
|
}
|
649
937
|
);
|
650
938
|
React__namespace.useEffect(() => {
|
@@ -670,7 +958,18 @@ const BulkLocalePublishAction = ({
|
|
670
958
|
documentIds: [documentId],
|
671
959
|
params: {
|
672
960
|
...params,
|
673
|
-
locale:
|
961
|
+
locale: localesForAction
|
962
|
+
}
|
963
|
+
});
|
964
|
+
setSelectedRows([]);
|
965
|
+
};
|
966
|
+
const unpublish = async () => {
|
967
|
+
await unpublishManyAction({
|
968
|
+
model,
|
969
|
+
documentIds: [documentId],
|
970
|
+
params: {
|
971
|
+
...params,
|
972
|
+
locale: localesForAction
|
674
973
|
}
|
675
974
|
});
|
676
975
|
setSelectedRows([]);
|
@@ -678,14 +977,12 @@ const BulkLocalePublishAction = ({
|
|
678
977
|
const handleAction = async () => {
|
679
978
|
if (draftRelationsCount > 0) {
|
680
979
|
setIsDraftRelationConfirmationOpen(true);
|
681
|
-
} else {
|
980
|
+
} else if (isBulkPublish) {
|
682
981
|
await publish();
|
982
|
+
} else {
|
983
|
+
await unpublish();
|
683
984
|
}
|
684
985
|
};
|
685
|
-
const isUnpublish = document?.status === "published";
|
686
|
-
if (isUnpublish) {
|
687
|
-
console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
|
688
|
-
}
|
689
986
|
if (isDraftRelationConfirmationOpen) {
|
690
987
|
return {
|
691
988
|
label: formatMessage({
|
@@ -720,20 +1017,21 @@ const BulkLocalePublishAction = ({
|
|
720
1017
|
}
|
721
1018
|
};
|
722
1019
|
}
|
1020
|
+
const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
|
723
1021
|
return {
|
724
1022
|
label: formatMessage({
|
725
|
-
id: getTranslation("
|
726
|
-
defaultMessage: "Publish Multiple Locales
|
1023
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
1024
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
727
1025
|
}),
|
728
|
-
|
729
|
-
|
1026
|
+
variant: isBulkPublish ? "secondary" : "danger",
|
1027
|
+
icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
|
1028
|
+
disabled: isOnPublishedTab || canPublish.length === 0,
|
730
1029
|
position: ["panel"],
|
731
|
-
variant: "secondary",
|
732
1030
|
dialog: {
|
733
1031
|
type: "modal",
|
734
1032
|
title: formatMessage({
|
735
|
-
id: getTranslation("
|
736
|
-
defaultMessage: "Publish Multiple Locales
|
1033
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
1034
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
737
1035
|
}),
|
738
1036
|
content: () => {
|
739
1037
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
@@ -752,28 +1050,35 @@ const BulkLocalePublishAction = ({
|
|
752
1050
|
validationErrors,
|
753
1051
|
headers,
|
754
1052
|
rows,
|
755
|
-
localesMetadata
|
1053
|
+
localesMetadata,
|
1054
|
+
action: action ?? "bulk-publish"
|
756
1055
|
}
|
757
1056
|
)
|
758
1057
|
}
|
759
1058
|
);
|
760
1059
|
},
|
761
|
-
footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.
|
1060
|
+
footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
|
762
1061
|
designSystem.Button,
|
763
1062
|
{
|
764
1063
|
loading: isDraftRelationsLoading,
|
765
|
-
disabled:
|
1064
|
+
disabled: !hasPermission || localesForAction.length === 0,
|
766
1065
|
variant: "default",
|
767
1066
|
onClick: handleAction,
|
768
1067
|
children: formatMessage({
|
769
|
-
id: "app.utils.publish",
|
770
|
-
defaultMessage: "Publish"
|
1068
|
+
id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
|
1069
|
+
defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
|
771
1070
|
})
|
772
1071
|
}
|
773
1072
|
) })
|
774
1073
|
}
|
775
1074
|
};
|
776
1075
|
};
|
1076
|
+
const BulkLocalePublishAction = (props) => {
|
1077
|
+
return BulkLocaleAction({ action: "bulk-publish", ...props });
|
1078
|
+
};
|
1079
|
+
const BulkLocaleUnpublishAction = (props) => {
|
1080
|
+
return BulkLocaleAction({ action: "bulk-unpublish", ...props });
|
1081
|
+
};
|
777
1082
|
const StyledTrash = styledComponents.styled(icons.Trash)`
|
778
1083
|
path {
|
779
1084
|
fill: currentColor;
|
@@ -830,16 +1135,9 @@ const UnpublishModalAdditionalInfo = () => {
|
|
830
1135
|
}
|
831
1136
|
) });
|
832
1137
|
};
|
833
|
-
const Initializer = ({ setPlugin }) => {
|
834
|
-
const setPluginRef = React__namespace.useRef(setPlugin);
|
835
|
-
React__namespace.useEffect(() => {
|
836
|
-
setPluginRef.current(pluginId);
|
837
|
-
}, []);
|
838
|
-
return null;
|
839
|
-
};
|
840
1138
|
const LocalePicker = () => {
|
841
1139
|
const { formatMessage } = reactIntl.useIntl();
|
842
|
-
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
1140
|
+
const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
|
843
1141
|
const { hasI18n, canRead, canCreate } = useI18n();
|
844
1142
|
const { data: locales = [] } = useGetLocalesQuery(void 0, {
|
845
1143
|
skip: !hasI18n
|
@@ -849,25 +1147,25 @@ const LocalePicker = () => {
|
|
849
1147
|
setQuery(
|
850
1148
|
{
|
851
1149
|
page: 1,
|
852
|
-
plugins: { ...
|
1150
|
+
plugins: { ...query2.plugins, i18n: { locale: code } }
|
853
1151
|
},
|
854
1152
|
"push",
|
855
1153
|
replace
|
856
1154
|
);
|
857
1155
|
},
|
858
|
-
[
|
1156
|
+
[query2.plugins, setQuery]
|
859
1157
|
);
|
860
1158
|
React__namespace.useEffect(() => {
|
861
1159
|
if (!Array.isArray(locales) || !hasI18n) {
|
862
1160
|
return;
|
863
1161
|
}
|
864
|
-
const currentDesiredLocale =
|
1162
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
865
1163
|
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
|
866
1164
|
const defaultLocale = locales.find((locale) => locale.isDefault);
|
867
1165
|
if (!doesLocaleExist && defaultLocale?.code) {
|
868
1166
|
handleChange(defaultLocale.code, true);
|
869
1167
|
}
|
870
|
-
}, [hasI18n, handleChange, locales,
|
1168
|
+
}, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
|
871
1169
|
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
872
1170
|
return null;
|
873
1171
|
}
|
@@ -882,7 +1180,7 @@ const LocalePicker = () => {
|
|
882
1180
|
id: getTranslation("actions.select-locale"),
|
883
1181
|
defaultMessage: "Select locale"
|
884
1182
|
}),
|
885
|
-
value:
|
1183
|
+
value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
|
886
1184
|
onChange: handleChange,
|
887
1185
|
children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
|
888
1186
|
}
|
@@ -1000,54 +1298,13 @@ const LocaleListCell = ({
|
|
1000
1298
|
return locale.name;
|
1001
1299
|
}).toSorted((a, b) => formatter.compare(a, b));
|
1002
1300
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
|
1003
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
1004
|
-
|
1005
|
-
{
|
1006
|
-
|
1007
|
-
alignItems: "center",
|
1008
|
-
justifyContent: "center",
|
1009
|
-
height: "3.2rem",
|
1010
|
-
width: "3.2rem",
|
1011
|
-
children: [
|
1012
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
|
1013
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}) })
|
1014
|
-
]
|
1015
|
-
}
|
1016
|
-
) }) }),
|
1301
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { variant: "ghost", type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { minWidth: "100%", alignItems: "center", justifyContent: "center", fontWeight: "regular", children: [
|
1302
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
|
1303
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) })
|
1304
|
+
] }) }) }),
|
1017
1305
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Content, { sideOffset: 16, children: /* @__PURE__ */ jsxRuntime.jsx("ul", { children: localesForDocument.map((name) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { padding: 3, tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: name }) }, name)) }) })
|
1018
1306
|
] });
|
1019
1307
|
};
|
1020
|
-
const Button = styledComponents.styled.button`
|
1021
|
-
width: 100%;
|
1022
|
-
|
1023
|
-
svg {
|
1024
|
-
> g,
|
1025
|
-
path {
|
1026
|
-
fill: ${({ theme }) => theme.colors.neutral500};
|
1027
|
-
}
|
1028
|
-
}
|
1029
|
-
&:hover {
|
1030
|
-
svg {
|
1031
|
-
> g,
|
1032
|
-
path {
|
1033
|
-
fill: ${({ theme }) => theme.colors.neutral600};
|
1034
|
-
}
|
1035
|
-
}
|
1036
|
-
}
|
1037
|
-
&:active {
|
1038
|
-
svg {
|
1039
|
-
> g,
|
1040
|
-
path {
|
1041
|
-
fill: ${({ theme }) => theme.colors.neutral400};
|
1042
|
-
}
|
1043
|
-
}
|
1044
|
-
}
|
1045
|
-
`;
|
1046
|
-
const ActionWrapper = styledComponents.styled(designSystem.Flex)`
|
1047
|
-
svg {
|
1048
|
-
height: 0.4rem;
|
1049
|
-
}
|
1050
|
-
`;
|
1051
1308
|
const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
1052
1309
|
const { options } = layout;
|
1053
1310
|
const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
|
@@ -1076,18 +1333,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
|
1076
1333
|
const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
|
1077
1334
|
return {
|
1078
1335
|
displayedHeaders: [
|
1079
|
-
|
1080
|
-
// ...displayedHeaders,
|
1336
|
+
...displayedHeaders,
|
1081
1337
|
{
|
1082
|
-
|
1083
|
-
|
1084
|
-
|
1085
|
-
label: {
|
1086
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
1087
|
-
defaultMessage: "locale"
|
1088
|
-
},
|
1089
|
-
searchable: false,
|
1090
|
-
sortable: false
|
1338
|
+
label: {
|
1339
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
1340
|
+
defaultMessage: "locale"
|
1091
1341
|
},
|
1092
1342
|
name: "locale"
|
1093
1343
|
}
|
@@ -1180,9 +1430,6 @@ const localeMiddleware = (ctx) => (next) => (permissions) => {
|
|
1180
1430
|
return next(revisedPermissions);
|
1181
1431
|
};
|
1182
1432
|
const prefixPluginTranslations = (trad, pluginId2) => {
|
1183
|
-
if (!pluginId2) {
|
1184
|
-
throw new TypeError("pluginId can't be empty");
|
1185
|
-
}
|
1186
1433
|
return Object.keys(trad).reduce((acc, current) => {
|
1187
1434
|
acc[`${pluginId2}.${current}`] = trad[current];
|
1188
1435
|
return acc;
|
@@ -1235,8 +1482,6 @@ const index = {
|
|
1235
1482
|
app.addRBACMiddleware([localeMiddleware]);
|
1236
1483
|
app.registerPlugin({
|
1237
1484
|
id: pluginId,
|
1238
|
-
initializer: Initializer,
|
1239
|
-
isReady: false,
|
1240
1485
|
name: pluginId
|
1241
1486
|
});
|
1242
1487
|
},
|
@@ -1254,11 +1499,11 @@ const index = {
|
|
1254
1499
|
},
|
1255
1500
|
id: "internationalization",
|
1256
1501
|
to: "internationalization",
|
1257
|
-
Component: () => Promise.resolve().then(() => require("./SettingsPage-
|
1502
|
+
Component: () => Promise.resolve().then(() => require("./SettingsPage-BTgjb2KS.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
|
1258
1503
|
permissions: PERMISSIONS.accessMain
|
1259
1504
|
});
|
1260
1505
|
const contentManager = app.getPlugin("content-manager");
|
1261
|
-
contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
|
1506
|
+
contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
|
1262
1507
|
contentManager.apis.addDocumentAction((actions) => {
|
1263
1508
|
const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
|
1264
1509
|
actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
|
@@ -1266,6 +1511,7 @@ const index = {
|
|
1266
1511
|
});
|
1267
1512
|
contentManager.apis.addDocumentAction((actions) => {
|
1268
1513
|
actions.splice(2, 0, BulkLocalePublishAction);
|
1514
|
+
actions.splice(5, 0, BulkLocaleUnpublishAction);
|
1269
1515
|
return actions;
|
1270
1516
|
});
|
1271
1517
|
contentManager.injectComponent("listView", "actions", {
|
@@ -1371,7 +1617,7 @@ const index = {
|
|
1371
1617
|
async registerTrads({ locales }) {
|
1372
1618
|
const importedTrads = await Promise.all(
|
1373
1619
|
locales.map((locale) => {
|
1374
|
-
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-
|
1620
|
+
return __variableDynamicImportRuntimeHelper(/* @__PURE__ */ Object.assign({ "./translations/de.json": () => Promise.resolve().then(() => require("./de-DtWiGdHl.js")), "./translations/dk.json": () => Promise.resolve().then(() => require("./dk-D8C-casx.js")), "./translations/en.json": () => Promise.resolve().then(() => require("./en-BKBz3tro.js")), "./translations/es.json": () => Promise.resolve().then(() => require("./es-DS-XFGSw.js")), "./translations/fr.json": () => Promise.resolve().then(() => require("./fr-BTjekDpq.js")), "./translations/ko.json": () => Promise.resolve().then(() => require("./ko-DmcGUBQ3.js")), "./translations/pl.json": () => Promise.resolve().then(() => require("./pl-Cn5RYonZ.js")), "./translations/ru.json": () => Promise.resolve().then(() => require("./ru-BMBgVL3s.js")), "./translations/tr.json": () => Promise.resolve().then(() => require("./tr-CarUU76c.js")), "./translations/zh-Hans.json": () => Promise.resolve().then(() => require("./zh-Hans-DSHIXAa3.js")), "./translations/zh.json": () => Promise.resolve().then(() => require("./zh-CukOviB0.js")) }), `./translations/${locale}.json`, 3).then(({ default: data }) => {
|
1375
1621
|
return {
|
1376
1622
|
data: prefixPluginTranslations(data, pluginId),
|
1377
1623
|
locale
|
@@ -1395,4 +1641,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
|
|
1395
1641
|
exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
|
1396
1642
|
exports.useGetLocalesQuery = useGetLocalesQuery;
|
1397
1643
|
exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
|
1398
|
-
//# sourceMappingURL=index-
|
1644
|
+
//# sourceMappingURL=index-3yyF237r.js.map
|