@strapi/i18n 0.0.0-experimental.25e22c6cc9bc6b35392bb55d09f641a0a65e7403 → 0.0.0-experimental.2bad311ac375d1115d085a9cee4fdbe11a455caf
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-VN7sTzkb.js → SettingsPage-CJOMVQv5.js} +15 -10
- package/dist/_chunks/SettingsPage-CJOMVQv5.js.map +1 -0
- package/dist/_chunks/{SettingsPage-Dsi2qGtq.mjs → SettingsPage-CnBFTsrq.mjs} +15 -10
- package/dist/_chunks/SettingsPage-CnBFTsrq.mjs.map +1 -0
- package/dist/_chunks/{en-18tWw4P6.mjs → en-BYRZFDBV.mjs} +11 -2
- package/dist/_chunks/en-BYRZFDBV.mjs.map +1 -0
- package/dist/_chunks/{en-Kv6y9zPQ.js → en-Dk9At9_Z.js} +11 -2
- package/dist/_chunks/en-Dk9At9_Z.js.map +1 -0
- package/dist/_chunks/{index-DhtjJYrx.mjs → index-BFk3nfTb.mjs} +416 -179
- package/dist/_chunks/index-BFk3nfTb.mjs.map +1 -0
- package/dist/_chunks/{index-kedPlCo6.js → index-C5SImSYG.js} +420 -183
- package/dist/_chunks/index-C5SImSYG.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 +29 -3
- 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 +62 -98
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +63 -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-Dsi2qGtq.mjs.map +0 -1
- package/dist/_chunks/SettingsPage-VN7sTzkb.js.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-DhtjJYrx.mjs.map +0 -1
- package/dist/_chunks/index-kedPlCo6.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
|
@@ -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");
|
|
@@ -160,7 +161,7 @@ const useI18n = () => {
|
|
|
160
161
|
model: params.slug
|
|
161
162
|
},
|
|
162
163
|
{
|
|
163
|
-
skip:
|
|
164
|
+
skip: true
|
|
164
165
|
}
|
|
165
166
|
);
|
|
166
167
|
if (doesPluginOptionsHaveI18nLocalized(schema?.pluginOptions)) {
|
|
@@ -240,10 +241,94 @@ const relationsApi = i18nApi.injectEndpoints({
|
|
|
240
241
|
})
|
|
241
242
|
});
|
|
242
243
|
const { useGetManyDraftRelationCountQuery } = relationsApi;
|
|
244
|
+
const cleanData = (data, schema, components) => {
|
|
245
|
+
const cleanedData = removeFields(data, [
|
|
246
|
+
"createdAt",
|
|
247
|
+
"createdBy",
|
|
248
|
+
"updatedAt",
|
|
249
|
+
"updatedBy",
|
|
250
|
+
"id",
|
|
251
|
+
"documentId",
|
|
252
|
+
"publishedAt",
|
|
253
|
+
"strapi_stage",
|
|
254
|
+
"strapi_assignee",
|
|
255
|
+
"locale",
|
|
256
|
+
"status"
|
|
257
|
+
]);
|
|
258
|
+
const cleanedDataWithoutPasswordAndRelation = recursiveRemoveFieldTypes(
|
|
259
|
+
cleanedData,
|
|
260
|
+
schema,
|
|
261
|
+
components,
|
|
262
|
+
["relation", "password"]
|
|
263
|
+
);
|
|
264
|
+
return cleanedDataWithoutPasswordAndRelation;
|
|
265
|
+
};
|
|
266
|
+
const removeFields = (data, fields) => {
|
|
267
|
+
return Object.keys(data).reduce((acc, current) => {
|
|
268
|
+
if (fields.includes(current)) {
|
|
269
|
+
return acc;
|
|
270
|
+
}
|
|
271
|
+
acc[current] = data[current];
|
|
272
|
+
return acc;
|
|
273
|
+
}, {});
|
|
274
|
+
};
|
|
275
|
+
const recursiveRemoveFieldTypes = (data, schema, components, fields) => {
|
|
276
|
+
return Object.keys(data).reduce((acc, current) => {
|
|
277
|
+
const attribute = schema.attributes[current] ?? { type: void 0 };
|
|
278
|
+
if (fields.includes(attribute.type)) {
|
|
279
|
+
return acc;
|
|
280
|
+
}
|
|
281
|
+
if (attribute.type === "dynamiczone") {
|
|
282
|
+
acc[current] = data[current].map((componentValue, index2) => {
|
|
283
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
|
284
|
+
componentValue,
|
|
285
|
+
components[componentValue.__component],
|
|
286
|
+
components,
|
|
287
|
+
fields
|
|
288
|
+
);
|
|
289
|
+
return {
|
|
290
|
+
...rest,
|
|
291
|
+
__temp_key__: index2 + 1
|
|
292
|
+
};
|
|
293
|
+
});
|
|
294
|
+
} else if (attribute.type === "component") {
|
|
295
|
+
const { repeatable, component } = attribute;
|
|
296
|
+
if (repeatable) {
|
|
297
|
+
acc[current] = (data[current] ?? []).map((compoData, index2) => {
|
|
298
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
|
299
|
+
compoData,
|
|
300
|
+
components[component],
|
|
301
|
+
components,
|
|
302
|
+
fields
|
|
303
|
+
);
|
|
304
|
+
return {
|
|
305
|
+
...rest,
|
|
306
|
+
__temp_key__: index2 + 1
|
|
307
|
+
};
|
|
308
|
+
});
|
|
309
|
+
} else {
|
|
310
|
+
const { id: _, ...rest } = recursiveRemoveFieldTypes(
|
|
311
|
+
data[current] ?? {},
|
|
312
|
+
components[component],
|
|
313
|
+
components,
|
|
314
|
+
fields
|
|
315
|
+
);
|
|
316
|
+
acc[current] = rest;
|
|
317
|
+
}
|
|
318
|
+
} else {
|
|
319
|
+
acc[current] = data[current];
|
|
320
|
+
}
|
|
321
|
+
return acc;
|
|
322
|
+
}, {});
|
|
323
|
+
};
|
|
243
324
|
const isErrorMessageDescriptor = (object) => {
|
|
244
325
|
return typeof object === "object" && object !== null && "id" in object && "defaultMessage" in object;
|
|
245
326
|
};
|
|
246
|
-
const EntryValidationText = ({
|
|
327
|
+
const EntryValidationText = ({
|
|
328
|
+
status = "draft",
|
|
329
|
+
validationErrors,
|
|
330
|
+
action
|
|
331
|
+
}) => {
|
|
247
332
|
const { formatMessage } = reactIntl.useIntl();
|
|
248
333
|
const getErrorStr = (key, value) => {
|
|
249
334
|
if (typeof value === "string") {
|
|
@@ -277,30 +362,63 @@ const EntryValidationText = ({ status = "draft", validationErrors }) => {
|
|
|
277
362
|
) })
|
|
278
363
|
] });
|
|
279
364
|
}
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
365
|
+
const getStatusMessage = () => {
|
|
366
|
+
if (action === "bulk-publish") {
|
|
367
|
+
if (status === "published") {
|
|
368
|
+
return {
|
|
369
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
|
370
|
+
text: formatMessage({
|
|
371
|
+
id: "content-manager.bulk-publish.already-published",
|
|
372
|
+
defaultMessage: "Already Published"
|
|
373
|
+
}),
|
|
374
|
+
textColor: "success600",
|
|
375
|
+
fontWeight: "bold"
|
|
376
|
+
};
|
|
377
|
+
} else if (status === "modified") {
|
|
378
|
+
return {
|
|
379
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowsCounterClockwise, { fill: "alternative600" }),
|
|
380
|
+
text: formatMessage({
|
|
381
|
+
id: "app.utils.ready-to-publish-changes",
|
|
382
|
+
defaultMessage: "Ready to publish changes"
|
|
383
|
+
})
|
|
384
|
+
};
|
|
385
|
+
} else {
|
|
386
|
+
return {
|
|
387
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
|
388
|
+
text: formatMessage({
|
|
389
|
+
id: "app.utils.ready-to-publish",
|
|
390
|
+
defaultMessage: "Ready to publish"
|
|
391
|
+
})
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
} else {
|
|
395
|
+
if (status === "draft") {
|
|
396
|
+
return {
|
|
397
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
|
398
|
+
text: formatMessage({
|
|
399
|
+
id: "content-manager.bulk-unpublish.already-unpublished",
|
|
400
|
+
defaultMessage: "Already Unpublished"
|
|
401
|
+
}),
|
|
402
|
+
textColor: "success600",
|
|
403
|
+
fontWeight: "bold"
|
|
404
|
+
};
|
|
405
|
+
} else {
|
|
406
|
+
return {
|
|
407
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.CheckCircle, { fill: "success600" }),
|
|
408
|
+
text: formatMessage({
|
|
409
|
+
id: "app.utils.ready-to-unpublish-changes",
|
|
410
|
+
defaultMessage: "Ready to unpublish"
|
|
411
|
+
}),
|
|
412
|
+
textColor: "success600",
|
|
413
|
+
fontWeight: "bold"
|
|
414
|
+
};
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
};
|
|
418
|
+
const { icon, text, textColor = "success600", fontWeight = "normal" } = getStatusMessage();
|
|
298
419
|
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
|
-
}) })
|
|
420
|
+
icon,
|
|
421
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor, fontWeight, children: text })
|
|
304
422
|
] });
|
|
305
423
|
};
|
|
306
424
|
const BoldChunk = (chunks) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: chunks });
|
|
@@ -308,7 +426,8 @@ const BulkLocaleActionModal = ({
|
|
|
308
426
|
headers,
|
|
309
427
|
rows,
|
|
310
428
|
localesMetadata,
|
|
311
|
-
validationErrors = {}
|
|
429
|
+
validationErrors = {},
|
|
430
|
+
action
|
|
312
431
|
}) => {
|
|
313
432
|
const { formatMessage } = reactIntl.useIntl();
|
|
314
433
|
const selectedRows = strapiAdmin.useTable(
|
|
@@ -321,27 +440,29 @@ const BulkLocaleActionModal = ({
|
|
|
321
440
|
return acc;
|
|
322
441
|
}, {});
|
|
323
442
|
const localesWithErrors = Object.keys(validationErrors);
|
|
324
|
-
const
|
|
443
|
+
const publishedCount = selectedRows.filter(
|
|
325
444
|
({ locale }) => currentStatusByLocale[locale] === "published"
|
|
326
445
|
).length;
|
|
327
|
-
const
|
|
446
|
+
const draftCount = selectedRows.filter(
|
|
328
447
|
({ locale }) => (currentStatusByLocale[locale] === "draft" || currentStatusByLocale[locale] === "modified") && !localesWithErrors.includes(locale)
|
|
329
448
|
).length;
|
|
330
449
|
const withErrorsCount = localesWithErrors.length;
|
|
450
|
+
const messageId = action === "bulk-publish" ? "content-manager.containers.list.selectedEntriesModal.selectedCount.publish" : "content-manager.containers.list.selectedEntriesModal.selectedCount.unpublish";
|
|
451
|
+
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
452
|
return formatMessage(
|
|
332
453
|
{
|
|
333
|
-
id:
|
|
334
|
-
defaultMessage
|
|
454
|
+
id: messageId,
|
|
455
|
+
defaultMessage
|
|
335
456
|
},
|
|
336
457
|
{
|
|
337
458
|
withErrorsCount,
|
|
338
|
-
|
|
339
|
-
|
|
459
|
+
draftCount,
|
|
460
|
+
publishedCount,
|
|
340
461
|
b: BoldChunk
|
|
341
462
|
}
|
|
342
463
|
);
|
|
343
464
|
};
|
|
344
|
-
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
465
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Modal.Body, { children: [
|
|
345
466
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: getFormattedCountMessage() }),
|
|
346
467
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { marginTop: 5, children: /* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Content, { children: [
|
|
347
468
|
/* @__PURE__ */ jsxRuntime.jsxs(strapiAdmin.Table.Head, { children: [
|
|
@@ -368,7 +489,7 @@ const BulkLocaleActionModal = ({
|
|
|
368
489
|
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
|
369
490
|
}
|
|
370
491
|
) }) }),
|
|
371
|
-
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status }) }),
|
|
492
|
+
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(EntryValidationText, { validationErrors: error, status, action }) }),
|
|
372
493
|
/* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Table.Cell, { children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
373
494
|
designSystem.IconButton,
|
|
374
495
|
{
|
|
@@ -385,7 +506,7 @@ const BulkLocaleActionModal = ({
|
|
|
385
506
|
name: locale
|
|
386
507
|
}
|
|
387
508
|
),
|
|
388
|
-
|
|
509
|
+
variant: "ghost",
|
|
389
510
|
children: /* @__PURE__ */ jsxRuntime.jsx(icons.Pencil, {})
|
|
390
511
|
}
|
|
391
512
|
) })
|
|
@@ -394,6 +515,48 @@ const BulkLocaleActionModal = ({
|
|
|
394
515
|
] }) })
|
|
395
516
|
] });
|
|
396
517
|
};
|
|
518
|
+
const statusVariants = {
|
|
519
|
+
draft: "secondary",
|
|
520
|
+
published: "success",
|
|
521
|
+
modified: "alternative"
|
|
522
|
+
};
|
|
523
|
+
const LocaleOption = ({
|
|
524
|
+
isDraftAndPublishEnabled,
|
|
525
|
+
locale,
|
|
526
|
+
status,
|
|
527
|
+
entryExists
|
|
528
|
+
}) => {
|
|
529
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
530
|
+
if (!entryExists) {
|
|
531
|
+
return formatMessage(
|
|
532
|
+
{
|
|
533
|
+
id: getTranslation("CMEditViewLocalePicker.locale.create"),
|
|
534
|
+
defaultMessage: "Create <bold>{locale}</bold> locale"
|
|
535
|
+
},
|
|
536
|
+
{
|
|
537
|
+
bold: (locale2) => /* @__PURE__ */ jsxRuntime.jsx("b", { children: locale2 }),
|
|
538
|
+
locale: locale.name
|
|
539
|
+
}
|
|
540
|
+
);
|
|
541
|
+
}
|
|
542
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { width: "100%", gap: 1, justifyContent: "space-between", children: [
|
|
543
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { children: locale.name }),
|
|
544
|
+
isDraftAndPublishEnabled ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
545
|
+
designSystem.Status,
|
|
546
|
+
{
|
|
547
|
+
display: "flex",
|
|
548
|
+
paddingLeft: "6px",
|
|
549
|
+
paddingRight: "6px",
|
|
550
|
+
paddingTop: "2px",
|
|
551
|
+
paddingBottom: "2px",
|
|
552
|
+
showBullet: false,
|
|
553
|
+
size: "S",
|
|
554
|
+
variant: statusVariants[status],
|
|
555
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "span", variant: "pi", fontWeight: "bold", children: capitalize(status) })
|
|
556
|
+
}
|
|
557
|
+
) : null
|
|
558
|
+
] });
|
|
559
|
+
};
|
|
397
560
|
const LocalePickerAction = ({
|
|
398
561
|
document,
|
|
399
562
|
meta,
|
|
@@ -402,74 +565,74 @@ const LocalePickerAction = ({
|
|
|
402
565
|
documentId
|
|
403
566
|
}) => {
|
|
404
567
|
const { formatMessage } = reactIntl.useIntl();
|
|
405
|
-
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
|
568
|
+
const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
|
|
406
569
|
const { hasI18n, canCreate, canRead } = useI18n();
|
|
407
570
|
const { data: locales = [] } = useGetLocalesQuery();
|
|
408
|
-
const
|
|
571
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
|
572
|
+
const { schema } = strapiAdmin$1.unstable_useDocument({
|
|
573
|
+
model,
|
|
574
|
+
collectionType,
|
|
575
|
+
documentId,
|
|
576
|
+
params: { locale: currentDesiredLocale }
|
|
577
|
+
});
|
|
409
578
|
const handleSelect = React__namespace.useCallback(
|
|
410
579
|
(value) => {
|
|
411
580
|
setQuery({
|
|
412
581
|
plugins: {
|
|
413
|
-
...
|
|
582
|
+
...query2.plugins,
|
|
414
583
|
i18n: {
|
|
415
584
|
locale: value
|
|
416
585
|
}
|
|
417
586
|
}
|
|
418
587
|
});
|
|
419
588
|
},
|
|
420
|
-
[
|
|
589
|
+
[query2.plugins, setQuery]
|
|
421
590
|
);
|
|
422
591
|
React__namespace.useEffect(() => {
|
|
423
592
|
if (!Array.isArray(locales) || !hasI18n) {
|
|
424
593
|
return;
|
|
425
594
|
}
|
|
426
|
-
const currentDesiredLocale = query.plugins?.i18n?.locale;
|
|
427
595
|
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
|
|
428
596
|
const defaultLocale = locales.find((locale) => locale.isDefault);
|
|
429
597
|
if (!doesLocaleExist && defaultLocale?.code) {
|
|
430
598
|
handleSelect(defaultLocale.code);
|
|
431
599
|
}
|
|
432
|
-
}, [handleSelect, hasI18n, locales,
|
|
433
|
-
|
|
434
|
-
return null;
|
|
435
|
-
}
|
|
436
|
-
const currentLocale = query.plugins?.i18n?.locale || locales.find((loc) => loc.isDefault)?.code;
|
|
600
|
+
}, [handleSelect, hasI18n, locales, currentDesiredLocale]);
|
|
601
|
+
const currentLocale = Array.isArray(locales) ? locales.find((locale) => locale.code === currentDesiredLocale) : void 0;
|
|
437
602
|
const allCurrentLocales = [
|
|
438
|
-
{ status: getDocumentStatus(document, meta), locale: currentLocale },
|
|
603
|
+
{ status: getDocumentStatus(document, meta), locale: currentLocale?.code },
|
|
439
604
|
...meta?.availableLocales ?? []
|
|
440
605
|
];
|
|
606
|
+
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
|
607
|
+
return null;
|
|
608
|
+
}
|
|
441
609
|
return {
|
|
442
610
|
label: formatMessage({
|
|
443
611
|
id: getTranslation("Settings.locales.modal.locales.label"),
|
|
444
612
|
defaultMessage: "Locales"
|
|
445
613
|
}),
|
|
446
614
|
options: locales.map((locale) => {
|
|
615
|
+
const entryWithLocaleExists = allCurrentLocales.some((doc) => doc.locale === locale.code);
|
|
447
616
|
const currentLocaleDoc = allCurrentLocales.find(
|
|
448
617
|
(doc) => "locale" in doc ? doc.locale === locale.code : false
|
|
449
618
|
);
|
|
450
|
-
const status = currentLocaleDoc?.status ?? "draft";
|
|
451
619
|
const permissionsToCheck = currentLocaleDoc ? canCreate : canRead;
|
|
452
|
-
const statusVariant = status === "draft" ? "primary" : status === "published" ? "success" : "alternative";
|
|
453
620
|
return {
|
|
454
621
|
disabled: !permissionsToCheck.includes(locale.code),
|
|
455
622
|
value: locale.code,
|
|
456
|
-
label:
|
|
457
|
-
|
|
458
|
-
designSystem.Status,
|
|
623
|
+
label: /* @__PURE__ */ jsxRuntime.jsx(
|
|
624
|
+
LocaleOption,
|
|
459
625
|
{
|
|
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) })
|
|
626
|
+
isDraftAndPublishEnabled: !!schema?.options?.draftAndPublish,
|
|
627
|
+
locale,
|
|
628
|
+
status: currentLocaleDoc?.status,
|
|
629
|
+
entryExists: entryWithLocaleExists
|
|
469
630
|
}
|
|
470
|
-
)
|
|
631
|
+
),
|
|
632
|
+
startIcon: !entryWithLocaleExists ? /* @__PURE__ */ jsxRuntime.jsx(icons.Plus, {}) : null
|
|
471
633
|
};
|
|
472
634
|
}),
|
|
635
|
+
customizeContent: () => currentLocale?.name,
|
|
473
636
|
onSelect: handleSelect,
|
|
474
637
|
value: currentLocale
|
|
475
638
|
};
|
|
@@ -485,6 +648,95 @@ const getDocumentStatus = (document, meta) => {
|
|
|
485
648
|
}
|
|
486
649
|
return docStatus;
|
|
487
650
|
};
|
|
651
|
+
const FillFromAnotherLocaleAction = ({
|
|
652
|
+
documentId,
|
|
653
|
+
meta,
|
|
654
|
+
model,
|
|
655
|
+
collectionType
|
|
656
|
+
}) => {
|
|
657
|
+
const { formatMessage } = reactIntl.useIntl();
|
|
658
|
+
const [{ query: query2 }] = strapiAdmin.useQueryParams();
|
|
659
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
|
660
|
+
const [localeSelected, setLocaleSelected] = React__namespace.useState(null);
|
|
661
|
+
const setValues = strapiAdmin.useForm("FillFromAnotherLocale", (state) => state.setValues);
|
|
662
|
+
const { getDocument } = strapiAdmin$1.unstable_useDocumentActions();
|
|
663
|
+
const { schema, components } = strapiAdmin$1.unstable_useDocument({
|
|
664
|
+
model,
|
|
665
|
+
documentId,
|
|
666
|
+
collectionType,
|
|
667
|
+
params: { locale: currentDesiredLocale }
|
|
668
|
+
});
|
|
669
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
|
670
|
+
const availableLocales = Array.isArray(locales) ? locales.filter((locale) => meta?.availableLocales.some((l) => l.locale === locale.code)) : [];
|
|
671
|
+
const fillFromLocale = (onClose) => async () => {
|
|
672
|
+
const response = await getDocument({
|
|
673
|
+
collectionType,
|
|
674
|
+
model,
|
|
675
|
+
documentId,
|
|
676
|
+
params: { locale: localeSelected }
|
|
677
|
+
});
|
|
678
|
+
if (!response || !schema) {
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
const { data } = response;
|
|
682
|
+
const cleanedData = cleanData(data, schema, components);
|
|
683
|
+
setValues(cleanedData);
|
|
684
|
+
onClose();
|
|
685
|
+
};
|
|
686
|
+
return {
|
|
687
|
+
type: "icon",
|
|
688
|
+
icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Download, {}),
|
|
689
|
+
disabled: availableLocales.length === 0,
|
|
690
|
+
label: formatMessage({
|
|
691
|
+
id: getTranslation("CMEditViewCopyLocale.copy-text"),
|
|
692
|
+
defaultMessage: "Fill in from another locale"
|
|
693
|
+
}),
|
|
694
|
+
dialog: {
|
|
695
|
+
type: "dialog",
|
|
696
|
+
title: formatMessage({
|
|
697
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.title"),
|
|
698
|
+
defaultMessage: "Confirmation"
|
|
699
|
+
}),
|
|
700
|
+
content: ({ onClose }) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
701
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Body, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 3, children: [
|
|
702
|
+
/* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "24px", height: "24px", fill: "danger600" }),
|
|
703
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
|
|
704
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.body"),
|
|
705
|
+
defaultMessage: "Your current content will be erased and filled by the content of the selected locale:"
|
|
706
|
+
}) }),
|
|
707
|
+
/* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { width: "100%", children: [
|
|
708
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
|
|
709
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.label"),
|
|
710
|
+
defaultMessage: "Locale"
|
|
711
|
+
}) }),
|
|
712
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
713
|
+
designSystem.SingleSelect,
|
|
714
|
+
{
|
|
715
|
+
value: localeSelected,
|
|
716
|
+
placeholder: formatMessage({
|
|
717
|
+
id: getTranslation("CMEditViewCopyLocale.dialog.field.placeholder"),
|
|
718
|
+
defaultMessage: "Select one locale..."
|
|
719
|
+
}),
|
|
720
|
+
onChange: (value) => setLocaleSelected(value),
|
|
721
|
+
children: availableLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.code))
|
|
722
|
+
}
|
|
723
|
+
)
|
|
724
|
+
] })
|
|
725
|
+
] }) }),
|
|
726
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Footer, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { gap: 2, width: "100%", children: [
|
|
727
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "tertiary", onClick: onClose, children: formatMessage({
|
|
728
|
+
id: getTranslation("CMEditViewCopyLocale.cancel-text"),
|
|
729
|
+
defaultMessage: "No, cancel"
|
|
730
|
+
}) }),
|
|
731
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Button, { flex: "auto", variant: "success", onClick: fillFromLocale(onClose), children: formatMessage({
|
|
732
|
+
id: getTranslation("CMEditViewCopyLocale.submit-text"),
|
|
733
|
+
defaultMessage: "Yes, fill in"
|
|
734
|
+
}) })
|
|
735
|
+
] }) })
|
|
736
|
+
] })
|
|
737
|
+
}
|
|
738
|
+
};
|
|
739
|
+
};
|
|
488
740
|
const DeleteLocaleAction = ({
|
|
489
741
|
document,
|
|
490
742
|
documentId,
|
|
@@ -496,16 +748,23 @@ const DeleteLocaleAction = ({
|
|
|
496
748
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
497
749
|
const { delete: deleteAction } = strapiAdmin$1.unstable_useDocumentActions();
|
|
498
750
|
const { hasI18n, canDelete } = useI18n();
|
|
751
|
+
const [{ query: query2 }] = strapiAdmin.useQueryParams();
|
|
752
|
+
const { data: locales = [] } = useGetLocalesQuery();
|
|
753
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
|
754
|
+
const locale = !("error" in locales) && locales.find((loc) => loc.code === currentDesiredLocale);
|
|
499
755
|
if (!hasI18n) {
|
|
500
756
|
return null;
|
|
501
757
|
}
|
|
502
758
|
return {
|
|
503
759
|
disabled: document?.locale && !canDelete.includes(document.locale) || !document || !document.id,
|
|
504
760
|
position: ["header", "table-row"],
|
|
505
|
-
label: formatMessage(
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
761
|
+
label: formatMessage(
|
|
762
|
+
{
|
|
763
|
+
id: getTranslation("actions.delete.label"),
|
|
764
|
+
defaultMessage: "Delete entry ({locale})"
|
|
765
|
+
},
|
|
766
|
+
{ locale: locale && locale.name }
|
|
767
|
+
),
|
|
509
768
|
icon: /* @__PURE__ */ jsxRuntime.jsx(StyledTrash, {}),
|
|
510
769
|
variant: "danger",
|
|
511
770
|
dialog: {
|
|
@@ -548,37 +807,43 @@ const DeleteLocaleAction = ({
|
|
|
548
807
|
}
|
|
549
808
|
};
|
|
550
809
|
};
|
|
551
|
-
const
|
|
810
|
+
const BulkLocaleAction = ({
|
|
552
811
|
document: baseDocument,
|
|
553
812
|
documentId,
|
|
554
813
|
model,
|
|
555
|
-
collectionType
|
|
814
|
+
collectionType,
|
|
815
|
+
action
|
|
556
816
|
}) => {
|
|
557
817
|
const baseLocale = baseDocument?.locale ?? null;
|
|
558
|
-
const [{ query }] = strapiAdmin.useQueryParams();
|
|
559
|
-
const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query), [query]);
|
|
560
|
-
const
|
|
818
|
+
const [{ query: query$1 }] = strapiAdmin.useQueryParams();
|
|
819
|
+
const params = React__namespace.useMemo(() => strapiAdmin$1.buildValidParams(query$1), [query$1]);
|
|
820
|
+
const isOnPublishedTab = query$1.status === "published";
|
|
561
821
|
const { formatMessage } = reactIntl.useIntl();
|
|
562
822
|
const { hasI18n, canPublish } = useI18n();
|
|
563
823
|
const { toggleNotification } = strapiAdmin.useNotification();
|
|
564
824
|
const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
|
|
565
825
|
const [selectedRows, setSelectedRows] = React__namespace.useState([]);
|
|
566
|
-
const [
|
|
567
|
-
const { publishMany: publishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
|
|
826
|
+
const [isDraftRelationConfirmationOpen, setIsDraftRelationConfirmationOpen] = React__namespace.useState(false);
|
|
827
|
+
const { publishMany: publishManyAction, unpublishMany: unpublishManyAction } = strapiAdmin$1.unstable_useDocumentActions();
|
|
568
828
|
const {
|
|
569
829
|
document,
|
|
570
830
|
meta: documentMeta,
|
|
571
831
|
schema,
|
|
572
832
|
validate
|
|
573
|
-
} = strapiAdmin$1.unstable_useDocument(
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
833
|
+
} = strapiAdmin$1.unstable_useDocument(
|
|
834
|
+
{
|
|
835
|
+
model,
|
|
836
|
+
collectionType,
|
|
837
|
+
documentId,
|
|
838
|
+
params: {
|
|
839
|
+
locale: baseLocale
|
|
840
|
+
}
|
|
841
|
+
},
|
|
842
|
+
{
|
|
843
|
+
skip: !hasI18n || !baseLocale
|
|
579
844
|
}
|
|
580
|
-
|
|
581
|
-
const { data: localesMetadata = [] } = useGetLocalesQuery();
|
|
845
|
+
);
|
|
846
|
+
const { data: localesMetadata = [] } = useGetLocalesQuery(hasI18n ? void 0 : query.skipToken);
|
|
582
847
|
const headers = [
|
|
583
848
|
{
|
|
584
849
|
label: formatMessage({
|
|
@@ -627,12 +892,19 @@ const BulkLocalePublishAction = ({
|
|
|
627
892
|
}, {});
|
|
628
893
|
return [rowsFromMeta, errors];
|
|
629
894
|
}, [document, documentMeta?.availableLocales, validate]);
|
|
630
|
-
const
|
|
631
|
-
|
|
895
|
+
const isBulkPublish = action === "bulk-publish";
|
|
896
|
+
const localesForAction = selectedRows.reduce((acc, selectedRow) => {
|
|
897
|
+
const isValidLocale = (
|
|
898
|
+
// Validation errors are irrelevant if we are trying to unpublish
|
|
899
|
+
!isBulkPublish || !Object.keys(validationErrors).includes(selectedRow.locale)
|
|
900
|
+
);
|
|
901
|
+
const shouldAddLocale = isBulkPublish ? selectedRow.status !== "published" && isValidLocale : selectedRow.status !== "draft" && isValidLocale;
|
|
902
|
+
if (shouldAddLocale) {
|
|
632
903
|
acc.push(selectedRow.locale);
|
|
633
904
|
}
|
|
634
905
|
return acc;
|
|
635
906
|
}, []);
|
|
907
|
+
const enableDraftRelationsCount = false;
|
|
636
908
|
const {
|
|
637
909
|
data: draftRelationsCount = 0,
|
|
638
910
|
isLoading: isDraftRelationsLoading,
|
|
@@ -641,10 +913,10 @@ const BulkLocalePublishAction = ({
|
|
|
641
913
|
{
|
|
642
914
|
model,
|
|
643
915
|
documentIds: [documentId],
|
|
644
|
-
locale:
|
|
916
|
+
locale: localesForAction
|
|
645
917
|
},
|
|
646
918
|
{
|
|
647
|
-
skip: !
|
|
919
|
+
skip: !enableDraftRelationsCount
|
|
648
920
|
}
|
|
649
921
|
);
|
|
650
922
|
React__namespace.useEffect(() => {
|
|
@@ -670,23 +942,32 @@ const BulkLocalePublishAction = ({
|
|
|
670
942
|
documentIds: [documentId],
|
|
671
943
|
params: {
|
|
672
944
|
...params,
|
|
673
|
-
locale:
|
|
945
|
+
locale: localesForAction
|
|
946
|
+
}
|
|
947
|
+
});
|
|
948
|
+
setSelectedRows([]);
|
|
949
|
+
};
|
|
950
|
+
const unpublish = async () => {
|
|
951
|
+
await unpublishManyAction({
|
|
952
|
+
model,
|
|
953
|
+
documentIds: [documentId],
|
|
954
|
+
params: {
|
|
955
|
+
...params,
|
|
956
|
+
locale: localesForAction
|
|
674
957
|
}
|
|
675
958
|
});
|
|
676
959
|
setSelectedRows([]);
|
|
677
960
|
};
|
|
678
961
|
const handleAction = async () => {
|
|
679
962
|
if (draftRelationsCount > 0) {
|
|
680
|
-
|
|
681
|
-
} else {
|
|
963
|
+
setIsDraftRelationConfirmationOpen(true);
|
|
964
|
+
} else if (isBulkPublish) {
|
|
682
965
|
await publish();
|
|
966
|
+
} else {
|
|
967
|
+
await unpublish();
|
|
683
968
|
}
|
|
684
969
|
};
|
|
685
|
-
|
|
686
|
-
if (isUnpublish) {
|
|
687
|
-
console.warn(["I18N"], "Bulk locale unpublish modal not implemented");
|
|
688
|
-
}
|
|
689
|
-
if (isConfirmationOpen) {
|
|
970
|
+
if (isDraftRelationConfirmationOpen) {
|
|
690
971
|
return {
|
|
691
972
|
label: formatMessage({
|
|
692
973
|
id: "app.components.ConfirmDialog.title",
|
|
@@ -695,11 +976,11 @@ const BulkLocalePublishAction = ({
|
|
|
695
976
|
variant: "danger",
|
|
696
977
|
dialog: {
|
|
697
978
|
onCancel: () => {
|
|
698
|
-
|
|
979
|
+
setIsDraftRelationConfirmationOpen(false);
|
|
699
980
|
},
|
|
700
981
|
onConfirm: async () => {
|
|
701
982
|
await publish();
|
|
702
|
-
|
|
983
|
+
setIsDraftRelationConfirmationOpen(false);
|
|
703
984
|
},
|
|
704
985
|
type: "dialog",
|
|
705
986
|
title: formatMessage({
|
|
@@ -709,27 +990,32 @@ const BulkLocalePublishAction = ({
|
|
|
709
990
|
content: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", alignItems: "center", gap: 2, children: [
|
|
710
991
|
/* @__PURE__ */ jsxRuntime.jsx(icons.WarningCircle, { width: "2.4rem", height: "2.4rem", fill: "danger600" }),
|
|
711
992
|
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
|
|
712
|
-
id: "
|
|
713
|
-
defaultMessage: "
|
|
993
|
+
id: getTranslation("CMEditViewBulkLocale.draft-relation-warning"),
|
|
994
|
+
defaultMessage: "Some locales are related to draft entries. Publishing them could leave broken links in your app."
|
|
995
|
+
}) }),
|
|
996
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", children: formatMessage({
|
|
997
|
+
id: getTranslation("CMEditViewBulkLocale.continue-confirmation"),
|
|
998
|
+
defaultMessage: "Are you sure you want to continue?"
|
|
714
999
|
}) })
|
|
715
1000
|
] })
|
|
716
1001
|
}
|
|
717
1002
|
};
|
|
718
1003
|
}
|
|
1004
|
+
const hasPermission = selectedRows.map(({ locale }) => locale).every((locale) => canPublish.includes(locale));
|
|
719
1005
|
return {
|
|
720
1006
|
label: formatMessage({
|
|
721
|
-
id: getTranslation("
|
|
722
|
-
defaultMessage: "Publish Multiple Locales
|
|
1007
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
|
1008
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
|
723
1009
|
}),
|
|
724
|
-
|
|
725
|
-
|
|
1010
|
+
variant: isBulkPublish ? "secondary" : "danger",
|
|
1011
|
+
icon: isBulkPublish ? /* @__PURE__ */ jsxRuntime.jsx(icons.ListPlus, {}) : /* @__PURE__ */ jsxRuntime.jsx(icons.Cross, {}),
|
|
1012
|
+
disabled: isOnPublishedTab || canPublish.length === 0,
|
|
726
1013
|
position: ["panel"],
|
|
727
|
-
variant: "secondary",
|
|
728
1014
|
dialog: {
|
|
729
1015
|
type: "modal",
|
|
730
1016
|
title: formatMessage({
|
|
731
|
-
id: getTranslation("
|
|
732
|
-
defaultMessage: "Publish Multiple Locales
|
|
1017
|
+
id: getTranslation(`CMEditViewBulkLocale.${isBulkPublish ? "publish" : "unpublish"}-title`),
|
|
1018
|
+
defaultMessage: `${isBulkPublish ? "Publish" : "Unpublish"} Multiple Locales`
|
|
733
1019
|
}),
|
|
734
1020
|
content: () => {
|
|
735
1021
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -748,28 +1034,35 @@ const BulkLocalePublishAction = ({
|
|
|
748
1034
|
validationErrors,
|
|
749
1035
|
headers,
|
|
750
1036
|
rows,
|
|
751
|
-
localesMetadata
|
|
1037
|
+
localesMetadata,
|
|
1038
|
+
action: action ?? "bulk-publish"
|
|
752
1039
|
}
|
|
753
1040
|
)
|
|
754
1041
|
}
|
|
755
1042
|
);
|
|
756
1043
|
},
|
|
757
|
-
footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.
|
|
1044
|
+
footer: () => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Modal.Footer, { justifyContent: "flex-end", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
758
1045
|
designSystem.Button,
|
|
759
1046
|
{
|
|
760
1047
|
loading: isDraftRelationsLoading,
|
|
761
|
-
disabled:
|
|
1048
|
+
disabled: !hasPermission || localesForAction.length === 0,
|
|
762
1049
|
variant: "default",
|
|
763
1050
|
onClick: handleAction,
|
|
764
1051
|
children: formatMessage({
|
|
765
|
-
id: "app.utils.publish",
|
|
766
|
-
defaultMessage: "Publish"
|
|
1052
|
+
id: isBulkPublish ? "app.utils.publish" : "app.utils.unpublish",
|
|
1053
|
+
defaultMessage: isBulkPublish ? "Publish" : "Unpublish"
|
|
767
1054
|
})
|
|
768
1055
|
}
|
|
769
1056
|
) })
|
|
770
1057
|
}
|
|
771
1058
|
};
|
|
772
1059
|
};
|
|
1060
|
+
const BulkLocalePublishAction = (props) => {
|
|
1061
|
+
return BulkLocaleAction({ action: "bulk-publish", ...props });
|
|
1062
|
+
};
|
|
1063
|
+
const BulkLocaleUnpublishAction = (props) => {
|
|
1064
|
+
return BulkLocaleAction({ action: "bulk-unpublish", ...props });
|
|
1065
|
+
};
|
|
773
1066
|
const StyledTrash = styledComponents.styled(icons.Trash)`
|
|
774
1067
|
path {
|
|
775
1068
|
fill: currentColor;
|
|
@@ -826,16 +1119,9 @@ const UnpublishModalAdditionalInfo = () => {
|
|
|
826
1119
|
}
|
|
827
1120
|
) });
|
|
828
1121
|
};
|
|
829
|
-
const Initializer = ({ setPlugin }) => {
|
|
830
|
-
const setPluginRef = React__namespace.useRef(setPlugin);
|
|
831
|
-
React__namespace.useEffect(() => {
|
|
832
|
-
setPluginRef.current(pluginId);
|
|
833
|
-
}, []);
|
|
834
|
-
return null;
|
|
835
|
-
};
|
|
836
1122
|
const LocalePicker = () => {
|
|
837
1123
|
const { formatMessage } = reactIntl.useIntl();
|
|
838
|
-
const [{ query }, setQuery] = strapiAdmin.useQueryParams();
|
|
1124
|
+
const [{ query: query2 }, setQuery] = strapiAdmin.useQueryParams();
|
|
839
1125
|
const { hasI18n, canRead, canCreate } = useI18n();
|
|
840
1126
|
const { data: locales = [] } = useGetLocalesQuery(void 0, {
|
|
841
1127
|
skip: !hasI18n
|
|
@@ -845,25 +1131,25 @@ const LocalePicker = () => {
|
|
|
845
1131
|
setQuery(
|
|
846
1132
|
{
|
|
847
1133
|
page: 1,
|
|
848
|
-
plugins: { ...
|
|
1134
|
+
plugins: { ...query2.plugins, i18n: { locale: code } }
|
|
849
1135
|
},
|
|
850
1136
|
"push",
|
|
851
1137
|
replace
|
|
852
1138
|
);
|
|
853
1139
|
},
|
|
854
|
-
[
|
|
1140
|
+
[query2.plugins, setQuery]
|
|
855
1141
|
);
|
|
856
1142
|
React__namespace.useEffect(() => {
|
|
857
1143
|
if (!Array.isArray(locales) || !hasI18n) {
|
|
858
1144
|
return;
|
|
859
1145
|
}
|
|
860
|
-
const currentDesiredLocale =
|
|
1146
|
+
const currentDesiredLocale = query2.plugins?.i18n?.locale;
|
|
861
1147
|
const doesLocaleExist = locales.find((loc) => loc.code === currentDesiredLocale);
|
|
862
1148
|
const defaultLocale = locales.find((locale) => locale.isDefault);
|
|
863
1149
|
if (!doesLocaleExist && defaultLocale?.code) {
|
|
864
1150
|
handleChange(defaultLocale.code, true);
|
|
865
1151
|
}
|
|
866
|
-
}, [hasI18n, handleChange, locales,
|
|
1152
|
+
}, [hasI18n, handleChange, locales, query2.plugins?.i18n?.locale]);
|
|
867
1153
|
if (!hasI18n || !Array.isArray(locales) || locales.length === 0) {
|
|
868
1154
|
return null;
|
|
869
1155
|
}
|
|
@@ -878,7 +1164,7 @@ const LocalePicker = () => {
|
|
|
878
1164
|
id: getTranslation("actions.select-locale"),
|
|
879
1165
|
defaultMessage: "Select locale"
|
|
880
1166
|
}),
|
|
881
|
-
value:
|
|
1167
|
+
value: query2.plugins?.i18n?.locale || locales.find((locale) => locale.isDefault)?.code,
|
|
882
1168
|
onChange: handleChange,
|
|
883
1169
|
children: displayedLocales.map((locale) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: locale.code, children: locale.name }, locale.id))
|
|
884
1170
|
}
|
|
@@ -996,54 +1282,13 @@ const LocaleListCell = ({
|
|
|
996
1282
|
return locale.name;
|
|
997
1283
|
}).toSorted((a, b) => formatter.compare(a, b));
|
|
998
1284
|
return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Popover.Root, { children: [
|
|
999
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Popover.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(Button, { type: "button", onClick: (e) => e.stopPropagation(), children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1000
|
-
|
|
1001
|
-
{
|
|
1002
|
-
|
|
1003
|
-
alignItems: "center",
|
|
1004
|
-
justifyContent: "center",
|
|
1005
|
-
height: "3.2rem",
|
|
1006
|
-
width: "3.2rem",
|
|
1007
|
-
children: [
|
|
1008
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, children: localesForDocument.join(", ") }),
|
|
1009
|
-
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, {}) })
|
|
1010
|
-
]
|
|
1011
|
-
}
|
|
1012
|
-
) }) }),
|
|
1285
|
+
/* @__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: [
|
|
1286
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textColor: "neutral800", ellipsis: true, marginRight: 2, children: localesForDocument.join(", ") }),
|
|
1287
|
+
/* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "1.2rem", height: "1.2rem" }) })
|
|
1288
|
+
] }) }) }),
|
|
1013
1289
|
/* @__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)) }) })
|
|
1014
1290
|
] });
|
|
1015
1291
|
};
|
|
1016
|
-
const Button = styledComponents.styled.button`
|
|
1017
|
-
width: 100%;
|
|
1018
|
-
|
|
1019
|
-
svg {
|
|
1020
|
-
> g,
|
|
1021
|
-
path {
|
|
1022
|
-
fill: ${({ theme }) => theme.colors.neutral500};
|
|
1023
|
-
}
|
|
1024
|
-
}
|
|
1025
|
-
&:hover {
|
|
1026
|
-
svg {
|
|
1027
|
-
> g,
|
|
1028
|
-
path {
|
|
1029
|
-
fill: ${({ theme }) => theme.colors.neutral600};
|
|
1030
|
-
}
|
|
1031
|
-
}
|
|
1032
|
-
}
|
|
1033
|
-
&:active {
|
|
1034
|
-
svg {
|
|
1035
|
-
> g,
|
|
1036
|
-
path {
|
|
1037
|
-
fill: ${({ theme }) => theme.colors.neutral400};
|
|
1038
|
-
}
|
|
1039
|
-
}
|
|
1040
|
-
}
|
|
1041
|
-
`;
|
|
1042
|
-
const ActionWrapper = styledComponents.styled(designSystem.Flex)`
|
|
1043
|
-
svg {
|
|
1044
|
-
height: 0.4rem;
|
|
1045
|
-
}
|
|
1046
|
-
`;
|
|
1047
1292
|
const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
|
1048
1293
|
const { options } = layout;
|
|
1049
1294
|
const isFieldLocalized = doesPluginOptionsHaveI18nLocalized(options) ? options.i18n.localized : false;
|
|
@@ -1072,18 +1317,11 @@ const addColumnToTableHook = ({ displayedHeaders, layout }) => {
|
|
|
1072
1317
|
const addLocaleToReleasesHook = ({ displayedHeaders = [] }) => {
|
|
1073
1318
|
return {
|
|
1074
1319
|
displayedHeaders: [
|
|
1075
|
-
|
|
1076
|
-
// ...displayedHeaders,
|
|
1320
|
+
...displayedHeaders,
|
|
1077
1321
|
{
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
label: {
|
|
1082
|
-
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1083
|
-
defaultMessage: "locale"
|
|
1084
|
-
},
|
|
1085
|
-
searchable: false,
|
|
1086
|
-
sortable: false
|
|
1322
|
+
label: {
|
|
1323
|
+
id: "content-releases.page.ReleaseDetails.table.header.label.locale",
|
|
1324
|
+
defaultMessage: "locale"
|
|
1087
1325
|
},
|
|
1088
1326
|
name: "locale"
|
|
1089
1327
|
}
|
|
@@ -1231,8 +1469,6 @@ const index = {
|
|
|
1231
1469
|
app.addRBACMiddleware([localeMiddleware]);
|
|
1232
1470
|
app.registerPlugin({
|
|
1233
1471
|
id: pluginId,
|
|
1234
|
-
initializer: Initializer,
|
|
1235
|
-
isReady: false,
|
|
1236
1472
|
name: pluginId
|
|
1237
1473
|
});
|
|
1238
1474
|
},
|
|
@@ -1250,11 +1486,11 @@ const index = {
|
|
|
1250
1486
|
},
|
|
1251
1487
|
id: "internationalization",
|
|
1252
1488
|
to: "internationalization",
|
|
1253
|
-
Component: () => Promise.resolve().then(() => require("./SettingsPage-
|
|
1489
|
+
Component: () => Promise.resolve().then(() => require("./SettingsPage-CJOMVQv5.js")).then((mod) => ({ default: mod.ProtectedSettingsPage })),
|
|
1254
1490
|
permissions: PERMISSIONS.accessMain
|
|
1255
1491
|
});
|
|
1256
1492
|
const contentManager = app.getPlugin("content-manager");
|
|
1257
|
-
contentManager.apis.addDocumentHeaderAction([LocalePickerAction]);
|
|
1493
|
+
contentManager.apis.addDocumentHeaderAction([LocalePickerAction, FillFromAnotherLocaleAction]);
|
|
1258
1494
|
contentManager.apis.addDocumentAction((actions) => {
|
|
1259
1495
|
const indexOfDeleteAction = actions.findIndex((action) => action.type === "delete");
|
|
1260
1496
|
actions.splice(indexOfDeleteAction, 0, DeleteLocaleAction);
|
|
@@ -1262,6 +1498,7 @@ const index = {
|
|
|
1262
1498
|
});
|
|
1263
1499
|
contentManager.apis.addDocumentAction((actions) => {
|
|
1264
1500
|
actions.splice(2, 0, BulkLocalePublishAction);
|
|
1501
|
+
actions.splice(5, 0, BulkLocaleUnpublishAction);
|
|
1265
1502
|
return actions;
|
|
1266
1503
|
});
|
|
1267
1504
|
contentManager.injectComponent("listView", "actions", {
|
|
@@ -1367,7 +1604,7 @@ const index = {
|
|
|
1367
1604
|
async registerTrads({ locales }) {
|
|
1368
1605
|
const importedTrads = await Promise.all(
|
|
1369
1606
|
locales.map((locale) => {
|
|
1370
|
-
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-
|
|
1607
|
+
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-Dk9At9_Z.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`).then(({ default: data }) => {
|
|
1371
1608
|
return {
|
|
1372
1609
|
data: prefixPluginTranslations(data, pluginId),
|
|
1373
1610
|
locale
|
|
@@ -1391,4 +1628,4 @@ exports.useDeleteLocaleMutation = useDeleteLocaleMutation;
|
|
|
1391
1628
|
exports.useGetDefaultLocalesQuery = useGetDefaultLocalesQuery;
|
|
1392
1629
|
exports.useGetLocalesQuery = useGetLocalesQuery;
|
|
1393
1630
|
exports.useUpdateLocaleMutation = useUpdateLocaleMutation;
|
|
1394
|
-
//# sourceMappingURL=index-
|
|
1631
|
+
//# sourceMappingURL=index-C5SImSYG.js.map
|