@strapi/i18n 5.42.0 → 5.42.1

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.
Files changed (58) hide show
  1. package/dist/admin/components/CMHeaderActions.js +28 -25
  2. package/dist/admin/components/CMHeaderActions.js.map +1 -1
  3. package/dist/admin/components/CMHeaderActions.mjs +26 -23
  4. package/dist/admin/components/CMHeaderActions.mjs.map +1 -1
  5. package/dist/admin/services/fillFromLocale.js +21 -0
  6. package/dist/admin/services/fillFromLocale.js.map +1 -0
  7. package/dist/admin/services/fillFromLocale.mjs +18 -0
  8. package/dist/admin/services/fillFromLocale.mjs.map +1 -0
  9. package/dist/admin/src/services/fillFromLocale.d.ts +2 -0
  10. package/dist/admin/translations/pl.json.js +48 -23
  11. package/dist/admin/translations/pl.json.js.map +1 -1
  12. package/dist/admin/translations/pl.json.mjs +48 -23
  13. package/dist/admin/translations/pl.json.mjs.map +1 -1
  14. package/dist/server/controllers/content-types.js +42 -2
  15. package/dist/server/controllers/content-types.js.map +1 -1
  16. package/dist/server/controllers/content-types.mjs +43 -3
  17. package/dist/server/controllers/content-types.mjs.map +1 -1
  18. package/dist/server/routes/admin.js +18 -0
  19. package/dist/server/routes/admin.js.map +1 -1
  20. package/dist/server/routes/admin.mjs +18 -0
  21. package/dist/server/routes/admin.mjs.map +1 -1
  22. package/dist/server/services/fill-from-locale.js +435 -0
  23. package/dist/server/services/fill-from-locale.js.map +1 -0
  24. package/dist/server/services/fill-from-locale.mjs +433 -0
  25. package/dist/server/services/fill-from-locale.mjs.map +1 -0
  26. package/dist/server/services/index.js +3 -1
  27. package/dist/server/services/index.js.map +1 -1
  28. package/dist/server/services/index.mjs +3 -1
  29. package/dist/server/services/index.mjs.map +1 -1
  30. package/dist/server/src/controllers/content-types.d.ts +1 -0
  31. package/dist/server/src/controllers/content-types.d.ts.map +1 -1
  32. package/dist/server/src/controllers/index.d.ts +1 -0
  33. package/dist/server/src/controllers/index.d.ts.map +1 -1
  34. package/dist/server/src/index.d.ts +7 -0
  35. package/dist/server/src/index.d.ts.map +1 -1
  36. package/dist/server/src/routes/admin.d.ts.map +1 -1
  37. package/dist/server/src/services/fill-from-locale.d.ts +16 -0
  38. package/dist/server/src/services/fill-from-locale.d.ts.map +1 -0
  39. package/dist/server/src/services/index.d.ts +6 -0
  40. package/dist/server/src/services/index.d.ts.map +1 -1
  41. package/dist/server/src/utils/index.d.ts +2 -0
  42. package/dist/server/src/utils/index.d.ts.map +1 -1
  43. package/dist/server/src/validation/content-types.d.ts +2 -1
  44. package/dist/server/src/validation/content-types.d.ts.map +1 -1
  45. package/dist/server/utils/index.js.map +1 -1
  46. package/dist/server/utils/index.mjs.map +1 -1
  47. package/dist/server/validation/content-types.js +15 -0
  48. package/dist/server/validation/content-types.js.map +1 -1
  49. package/dist/server/validation/content-types.mjs +15 -1
  50. package/dist/server/validation/content-types.mjs.map +1 -1
  51. package/dist/shared/contracts/content-manager.d.ts +27 -0
  52. package/dist/shared/contracts/content-manager.d.ts.map +1 -0
  53. package/package.json +8 -8
  54. package/dist/admin/src/utils/clean.d.ts +0 -4
  55. package/dist/admin/utils/clean.js +0 -70
  56. package/dist/admin/utils/clean.js.map +0 -1
  57. package/dist/admin/utils/clean.mjs +0 -68
  58. package/dist/admin/utils/clean.mjs.map +0 -1
@@ -1,47 +1,72 @@
1
1
  var pl = {
2
- "CMEditViewCopyLocale.copy-failure": "Nie udało się skopiować ustawień regionalnych",
3
- "CMEditViewCopyLocale.copy-success": "Ustawienia regionalne skopiowane",
4
- "CMEditViewCopyLocale.copy-text": "Wypełnij używając innych ustawień regionalnych",
2
+ "actions.delete.label": "Usuń wpis ({locale})",
3
+ "actions.delete.dialog.title": "Potwierdzenie",
4
+ "actions.delete.dialog.body": "Czy na pewno chcesz usunąć ten język?",
5
+ "actions.delete.error": "Wystąpił błąd podczas usuwania języka wpisu.",
6
+ "CMEditViewCopyLocale.copy-failure": "Nie udało się skopiować języka",
7
+ "CMEditViewCopyLocale.copy-success": "Język skopiowany",
8
+ "CMEditViewCopyLocale.copy-text": "Wypełnij używając innego języka",
9
+ "CMEditViewCopyLocale.cancel-text": "Nie, anuluj",
5
10
  "CMEditViewCopyLocale.submit-text": "Tak, wypełnij",
6
- "CMListView.popover.display-locales.label": "Wyświetl przetłumaczone ustawienia regionalne",
11
+ "CMEditViewCopyLocale.dialog.title": "Potwierdzenie",
12
+ "CMEditViewCopyLocale.dialog.body": "Twoja bieżąca zawartość zostanie usunięta i wypełniona zawartością wybranego języka:",
13
+ "CMEditViewCopyLocale.dialog.field.label": "Język",
14
+ "CMEditViewCopyLocale.dialog.field.placeholder": "Wybierz jeden język...",
15
+ "CMEditViewBulkLocale.publish-title": "Opublikuj wiele języków",
16
+ "CMEditViewBulkLocale.unpublish-title": "Cofnij publikację dla wielu języków",
17
+ "CMEditViewBulkLocale.status": "Status",
18
+ "CMEditViewBulkLocale.publication-status": "Status publikacji",
19
+ "CMEditViewBulkLocale.draft-relation-warning": "Niektóre języki są powiązane z wersjami roboczymi. Ich opublikowanie może spowodować pozostawienie uszkodzonych linków w aplikacji.",
20
+ "CMEditViewBulkLocale.continue-confirmation": "Czy na pewno chcesz kontynuować?",
21
+ "CMEditViewAITranslation.status-aria-label": "Status translacji AI",
22
+ "CMEditViewAITranslation.status-title": "{enabled, select, true {Tłumaczenia AI włączone} false {Tłumaczenia AI wyłączone} other {Tłumaczenia AI wyłączone}}",
23
+ "CMEditViewAITranslation.status-description": "Nasza sztuczna inteligencja tłumaczy treść we wszystkich językach za każdym razem, gdy modyfikujesz ustawienia domyślne.",
24
+ "CMEditViewAITranslation.settings-link": "{enabled, select, true {Wyłącz w ustawieniach} false {Włącz w ustawieniach} other {Włącz w ustawieniach}}",
25
+ "CMEditViewAITranslation.job-completed": "Tłumaczenie AI zakończone sukcesem!",
26
+ "CMEditViewAITranslation.job-failed": "Tłumaczenie AI nie powiodło się. Spróbuj ponownie.",
27
+ "CMEditViewLocalePicker.locale.create": "Utwórz język <bold>{locale}</bold>",
28
+ "CMEditViewLocalePicker.locale.ai-translations": "Tłumaczenia AI:",
29
+ "CMListView.popover.display-locales.label": "Wyświetl przetłumaczone ustawienia języka",
30
+ "CMListView.popover.display-locales.more": "{locales} + {count} więcej",
7
31
  "CheckboxConfirmation.Modal.body": "Czy chcesz to wyłączyć?",
8
32
  "CheckboxConfirmation.Modal.button-confirm": "Tak, wyłącz",
9
33
  "CheckboxConfirmation.Modal.content": "Wyłączenie lokalizacji sprawi, że zostanie usunięta cała zawartość oprócz tej powiązanej z domyślnym ustawieniem regionalnym (o ile taka istnieje).",
10
- "Field.localized": "Ta wartość jest unikalna dla wybranych ustawień regionalnych",
11
- "Field.not-localized": "Ta wartość jest wspólna dla wszystkich ustawień regionalnych",
12
- "Settings.list.actions.add": "Dodaj nowe",
34
+ "Field.localized": "Ta wartość jest unikalna dla wybranych języków",
35
+ "Field.not-localized": "Ta wartość jest wspólna dla wszystkich języków",
36
+ "Settings.list.actions.add": "Dodaj język",
13
37
  "Settings.list.actions.delete": "Usuń",
14
- "Settings.list.actions.deleteAdditionalInfos": "Aktywne ustawienia regionalne zostaną usnięte <em>(from Internationalization)</em>",
38
+ "Settings.list.actions.deleteAdditionalInfos": "Aktywne wersje językowe zostaną usunięte <em>(z pluginu Internacjonalizacja)</em>",
39
+ "Settings.list.actions.publishAdditionalInfos": "To opublikuje aktywne wersje językowe <em>(z pluginu Internacjonalizacja)</em>",
40
+ "Settings.list.actions.unpublishAdditionalInfos": "To cofnie publikację aktywnych wersji językowych <em>(z pluginu Internacjonalizacja)</em>",
15
41
  "Settings.list.actions.edit": "Edytuj",
16
- "Settings.list.description": "Skonfiguruj ustawienia dla pluginu Internationalization",
42
+ "Settings.list.description": "Skonfiguruj ustawienia dla pluginu Internacjonalizacja",
17
43
  "Settings.list.empty.description": "To nie jest standardowe zachowanie, co oznacza że ostatecznie zmieniłeś bazę danych manualnie. Aby poprawnie używać strapi upewnij się, że w bazie masz zapisane przynajmniej jedno ustawienie regionalne.",
18
- "Settings.list.empty.title": "Brak ustawień regionalnych.",
44
+ "Settings.list.empty.title": "Brak języków.",
45
+ "Settings.aiLocalizations.label": "Tłumaczenia AI",
46
+ "Settings.aiLocalizations.description": "Za każdym razem, gdy zapiszesz coś w Menedżerze treści, nasza sztuczna inteligencja użyje domyślnego języka, aby automatycznie przetłumaczyć wszystkie inne języki.",
19
47
  "Settings.locales.default": "domyślne",
20
48
  "Settings.locales.list.sort.default": "Sortuj domyślnie",
21
49
  "Settings.locales.list.sort.displayName": "Sortuj po nazwie",
22
50
  "Settings.locales.list.sort.id": "Sortuj po ID",
23
51
  "Settings.locales.modal.advanced": "Ustawienia zaawansowane",
24
52
  "Settings.locales.modal.advanced.setAsDefault": "Ustaw jako domyślne",
25
- "Settings.locales.modal.advanced.setAsDefault.hint": "Jedno domyślne ustawienie regionalne jest wymagane, zmień to poprzez wybranie innego.",
53
+ "Settings.locales.modal.advanced.setAsDefault.hint": "Jeden domyślny język jest wymagany, zmień to poprzez wybranie innego.",
26
54
  "Settings.locales.modal.advanced.settings": "Ustawienia",
27
55
  "Settings.locales.modal.base": "Ustawienia podstawowe",
28
- "Settings.locales.modal.create.alreadyExist": "To ustawienie już istnieje",
29
- "Settings.locales.modal.create.defaultLocales.loading": "Ładowanie dostępnych ustawień regionalnych...",
30
56
  "Settings.locales.modal.create.success": "Ustawienie dodane",
31
- "Settings.locales.modal.create.tab.label": "Nawigowanie pomiędzy I18N podstawowowymi a zaawansowanymi ustawieniami",
57
+ "Settings.locales.modal.create.code.label": "Języki",
58
+ "Settings.locales.modal.create.code.error": "Wybierz język",
59
+ "Settings.locales.modal.create.name.description": "Język będzie wyświetlany pod tą nazwą w panelu administracyjnym",
60
+ "Settings.locales.modal.create.name.label": "Nazwa wyświetlana",
61
+ "Settings.locales.modal.create.name.error.min": "Nazwa wyświetlana języka może mieć maksymalnie 50 znaków.",
62
+ "Settings.locales.modal.create.name.error.required": "Proszę podać nazwę wyświetlaną dla języka",
32
63
  "Settings.locales.modal.delete.confirm": "Tak, usuń",
33
64
  "Settings.locales.modal.delete.message": "Usunięcie tego ustawienia usunie również całą powiązaną zawartość. Jeśli chcesz zatrzymać jakąś treść upewnij się, że przeniosłeś ją do innych ustawień regionalnych.",
34
65
  "Settings.locales.modal.delete.secondMessage": "Czy chcesz usunąć to ustawienie?",
35
66
  "Settings.locales.modal.delete.success": "Usunięto",
36
67
  "Settings.locales.modal.edit.confirmation": "Zakończ",
37
- "Settings.locales.modal.create.code.label": "Ustawienia regionalne",
38
68
  "Settings.locales.modal.edit.success": "Edytowano",
39
- "Settings.locales.modal.edit.tab.label": "Nawigowanie pomiędzy I18N podstawowowymi a zaawansowanymi ustawieniami",
40
- "Settings.locales.modal.create.name.label": "Nazwa wyświetlana dla ustawienia regionalnego",
41
- "Settings.locales.modal.create.name.label.description": "Zostanie wyświetlone pod taką nazwą w panelu administracyjnym.",
42
- "Settings.locales.modal.create.name.label.error": "Nazwa wyświetlana nie może mieć więcej niż 50 znaków.",
43
- "Settings.locales.modal.locales.label": "Ustawienia regionalne",
44
- "Settings.locales.modal.locales.loaded": "Pomyślnie załadowane.",
69
+ "Settings.locales.modal.edit.tab.label": "Nawigowanie pomiędzy I18N podstawowymi a zaawansowanymi ustawieniami",
45
70
  "Settings.locales.modal.title": "Konfiguracja",
46
71
  "Settings.locales.row.default-locale": "Domyślne",
47
72
  "Settings.locales.row.displayName": "Nazwa",
@@ -54,8 +79,8 @@ var pl = {
54
79
  "plugin.description.long": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
55
80
  "plugin.description.short": "Ten plugin umożliwia tworzenie, czytanie i aktualizowanie treści w różnych językach, zarówno z poziomu panelu admina jak i z API.",
56
81
  "plugin.name": "Internationalization",
57
- "plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych ustawieniach regionalnych",
58
- "plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych ustawień regionalnych",
82
+ "plugin.schema.i18n.localized.description-content-type": "Pozwala mieć treść w różnych językach",
83
+ "plugin.schema.i18n.localized.description-field": "To pole może mieć różne wartości w zależności od różnych języków",
59
84
  "plugin.schema.i18n.localized.label-content-type": "Włącz lokalizację dla tego typu treści",
60
85
  "plugin.schema.i18n.localized.label-field": "Włącz lokalizację dla tego pola"
61
86
  };
@@ -1 +1 @@
1
- {"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"pl.json.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -12,7 +12,7 @@ const getFieldsProperty = fp.prop('properties.fields');
12
12
  const getFirstLevelPath = fp.map((path)=>path.split('.')[0]);
13
13
  const controller = {
14
14
  async getNonLocalizedAttributes (ctx) {
15
- const { user } = ctx.state;
15
+ const { user, userAbility } = ctx.state;
16
16
  const body = ctx.request.body;
17
17
  const { model, id, locale } = body;
18
18
  await contentTypes.validateGetNonLocalizedAttributesInput({
@@ -20,6 +20,13 @@ const controller = {
20
20
  id,
21
21
  locale
22
22
  });
23
+ const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
24
+ userAbility,
25
+ model
26
+ });
27
+ if (permissionChecker.cannot.read()) {
28
+ return ctx.forbidden();
29
+ }
23
30
  const { copyNonLocalizedAttributes, isLocalizedContentType, getNestedPopulateOfNonLocalizedAttributes } = index.getService('content-types');
24
31
  const { default: { READ_ACTION, CREATE_ACTION } } = strapi.service('admin::constants');
25
32
  const modelDef = strapi.contentType(model);
@@ -52,7 +59,15 @@ const controller = {
52
59
  const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
53
60
  const permittedFields = fp.pipe(fp.flatten, getFirstLevelPath, fp.uniq)(localePermissions);
54
61
  const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
55
- const sanitizedNonLocalizedFields = fp.pick(permittedFields, nonLocalizedFields);
62
+ const pickedFields = fp.pick(permittedFields, nonLocalizedFields);
63
+ // Guard relations: omit fields that point to content types the user cannot read
64
+ const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
65
+ const attribute = modelDef.attributes?.[key];
66
+ if (attribute?.type === 'relation' && attribute.target) {
67
+ return userAbility.can(READ_ACTION, attribute.target);
68
+ }
69
+ return true;
70
+ }));
56
71
  const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
57
72
  availableLocales: true
58
73
  });
@@ -69,6 +84,31 @@ const controller = {
69
84
  PUBLISHED_AT_ATTRIBUTE
70
85
  ], entity))
71
86
  };
87
+ },
88
+ async getFillFromLocaleData (ctx) {
89
+ const { userAbility } = ctx.state;
90
+ const { model } = ctx.params;
91
+ await contentTypes.validateFillFromLocaleInput(ctx.query);
92
+ const { documentId, sourceLocale, targetLocale } = ctx.query;
93
+ const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
94
+ userAbility,
95
+ model
96
+ });
97
+ if (permissionChecker.cannot.read()) {
98
+ return ctx.forbidden();
99
+ }
100
+ const fillFromLocaleService = index.getService('fill-from-locale');
101
+ const rawDocument = await fillFromLocaleService.fetchRawDocument(model, sourceLocale, documentId);
102
+ if (!rawDocument) {
103
+ return ctx.notFound();
104
+ }
105
+ // Field-level filtering: strip fields the user cannot read on this content type
106
+ const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);
107
+ // Transform relations to target locale, skipping those the user cannot read
108
+ const data = await fillFromLocaleService.transformDocument(sanitizedDocument, model, targetLocale, userAbility);
109
+ ctx.body = {
110
+ data
111
+ };
72
112
  }
73
113
  };
74
114
 
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","strapi","service","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","sanitizedNonLocalizedFields","pick","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.js","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import { getOr, prop, map, pipe, flatten, uniq, pick } from 'lodash/fp';
2
2
  import { errors, contentTypes } from '@strapi/utils';
3
3
  import { getService } from '../utils/index.mjs';
4
- import { validateGetNonLocalizedAttributesInput } from '../validation/content-types.mjs';
4
+ import { validateFillFromLocaleInput, validateGetNonLocalizedAttributesInput } from '../validation/content-types.mjs';
5
5
 
6
6
  const { ApplicationError } = errors;
7
7
  const { PUBLISHED_AT_ATTRIBUTE } = contentTypes.constants;
@@ -10,7 +10,7 @@ const getFieldsProperty = prop('properties.fields');
10
10
  const getFirstLevelPath = map((path)=>path.split('.')[0]);
11
11
  const controller = {
12
12
  async getNonLocalizedAttributes (ctx) {
13
- const { user } = ctx.state;
13
+ const { user, userAbility } = ctx.state;
14
14
  const body = ctx.request.body;
15
15
  const { model, id, locale } = body;
16
16
  await validateGetNonLocalizedAttributesInput({
@@ -18,6 +18,13 @@ const controller = {
18
18
  id,
19
19
  locale
20
20
  });
21
+ const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
22
+ userAbility,
23
+ model
24
+ });
25
+ if (permissionChecker.cannot.read()) {
26
+ return ctx.forbidden();
27
+ }
21
28
  const { copyNonLocalizedAttributes, isLocalizedContentType, getNestedPopulateOfNonLocalizedAttributes } = getService('content-types');
22
29
  const { default: { READ_ACTION, CREATE_ACTION } } = strapi.service('admin::constants');
23
30
  const modelDef = strapi.contentType(model);
@@ -50,7 +57,15 @@ const controller = {
50
57
  const localePermissions = permissions.filter((perm)=>getLocalesProperty(perm).includes(locale)).map(getFieldsProperty);
51
58
  const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);
52
59
  const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);
53
- const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);
60
+ const pickedFields = pick(permittedFields, nonLocalizedFields);
61
+ // Guard relations: omit fields that point to content types the user cannot read
62
+ const sanitizedNonLocalizedFields = Object.fromEntries(Object.entries(pickedFields).filter(([key])=>{
63
+ const attribute = modelDef.attributes?.[key];
64
+ if (attribute?.type === 'relation' && attribute.target) {
65
+ return userAbility.can(READ_ACTION, attribute.target);
66
+ }
67
+ return true;
68
+ }));
54
69
  const availableLocalesResult = await strapi.plugins['content-manager'].service('document-metadata').getMetadata(model, entity, {
55
70
  availableLocales: true
56
71
  });
@@ -67,6 +82,31 @@ const controller = {
67
82
  PUBLISHED_AT_ATTRIBUTE
68
83
  ], entity))
69
84
  };
85
+ },
86
+ async getFillFromLocaleData (ctx) {
87
+ const { userAbility } = ctx.state;
88
+ const { model } = ctx.params;
89
+ await validateFillFromLocaleInput(ctx.query);
90
+ const { documentId, sourceLocale, targetLocale } = ctx.query;
91
+ const permissionChecker = strapi.plugin('content-manager').service('permission-checker').create({
92
+ userAbility,
93
+ model
94
+ });
95
+ if (permissionChecker.cannot.read()) {
96
+ return ctx.forbidden();
97
+ }
98
+ const fillFromLocaleService = getService('fill-from-locale');
99
+ const rawDocument = await fillFromLocaleService.fetchRawDocument(model, sourceLocale, documentId);
100
+ if (!rawDocument) {
101
+ return ctx.notFound();
102
+ }
103
+ // Field-level filtering: strip fields the user cannot read on this content type
104
+ const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);
105
+ // Transform relations to target locale, skipping those the user cannot read
106
+ const data = await fillFromLocaleService.transformDocument(sanitizedDocument, model, targetLocale, userAbility);
107
+ ctx.body = {
108
+ data
109
+ };
70
110
  }
71
111
  };
72
112
 
@@ -1 +1 @@
1
- {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core } from '@strapi/types';\nimport { getService } from '../utils';\nimport { validateGetNonLocalizedAttributesInput } from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const sanitizedNonLocalizedFields = pick(permittedFields, nonLocalizedFields);\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","strapi","service","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","sanitizedNonLocalizedFields","pick","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat"],"mappings":"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"}
1
+ {"version":3,"file":"content-types.mjs","sources":["../../../server/src/controllers/content-types.ts"],"sourcesContent":["import { pick, uniq, prop, getOr, flatten, pipe, map } from 'lodash/fp';\nimport { contentTypes as contentTypesUtils, errors } from '@strapi/utils';\nimport type { Core, UID } from '@strapi/types';\nimport type { FillFromLocale } from '../../../shared/contracts/content-manager';\nimport { getService } from '../utils';\nimport {\n validateGetNonLocalizedAttributesInput,\n validateFillFromLocaleInput,\n} from '../validation/content-types';\n\nconst { ApplicationError } = errors;\n\nconst { PUBLISHED_AT_ATTRIBUTE } = contentTypesUtils.constants;\n\nconst getLocalesProperty = getOr<string[]>([], 'properties.locales');\nconst getFieldsProperty = prop('properties.fields');\n\nconst getFirstLevelPath = map((path: string) => path.split('.')[0]);\n\nconst controller = {\n async getNonLocalizedAttributes(ctx) {\n const { user, userAbility } = ctx.state;\n const body = ctx.request.body as any;\n const { model, id, locale } = body;\n\n await validateGetNonLocalizedAttributesInput({ model, id, locale });\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const {\n copyNonLocalizedAttributes,\n isLocalizedContentType,\n getNestedPopulateOfNonLocalizedAttributes,\n } = getService('content-types');\n\n const {\n default: { READ_ACTION, CREATE_ACTION },\n } = strapi.service('admin::constants');\n\n const modelDef = strapi.contentType(model);\n const attributesToPopulate = getNestedPopulateOfNonLocalizedAttributes(model);\n\n if (!isLocalizedContentType(modelDef)) {\n throw new ApplicationError(`Model ${model} is not localized`);\n }\n\n const params = modelDef.kind === 'singleType' ? {} : { id };\n\n const entity = await strapi.db\n .query(model)\n .findOne({ where: params, populate: attributesToPopulate });\n\n if (!entity) {\n return ctx.notFound();\n }\n\n const permissions = await strapi.admin.services.permission.findMany({\n where: {\n action: [READ_ACTION, CREATE_ACTION],\n subject: model,\n role: {\n id: user.roles.map(prop('id')),\n },\n },\n });\n\n const localePermissions = permissions\n .filter((perm: any) => getLocalesProperty(perm).includes(locale))\n .map(getFieldsProperty);\n\n const permittedFields = pipe(flatten, getFirstLevelPath, uniq)(localePermissions);\n\n const nonLocalizedFields = copyNonLocalizedAttributes(modelDef, entity);\n const pickedFields = pick(permittedFields, nonLocalizedFields);\n\n // Guard relations: omit fields that point to content types the user cannot read\n const sanitizedNonLocalizedFields = Object.fromEntries(\n Object.entries(pickedFields).filter(([key]) => {\n const attribute = modelDef.attributes?.[key] as any;\n if (attribute?.type === 'relation' && attribute.target) {\n return userAbility.can(READ_ACTION, attribute.target);\n }\n return true;\n })\n );\n\n const availableLocalesResult = await strapi.plugins['content-manager']\n .service('document-metadata')\n .getMetadata(model, entity, {\n availableLocales: true,\n });\n\n const availableLocales = availableLocalesResult.availableLocales.map((localeResult: any) =>\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], localeResult)\n );\n\n ctx.body = {\n nonLocalizedFields: sanitizedNonLocalizedFields,\n localizations: availableLocales.concat(\n pick(['id', 'locale', PUBLISHED_AT_ATTRIBUTE], entity)\n ),\n };\n },\n\n async getFillFromLocaleData(ctx) {\n const { userAbility } = ctx.state;\n const { model } = ctx.params;\n\n await validateFillFromLocaleInput(ctx.query);\n\n const { documentId, sourceLocale, targetLocale } = ctx.query as unknown as Omit<\n FillFromLocale.Params,\n 'model'\n >;\n\n const permissionChecker = strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model });\n\n if (permissionChecker.cannot.read()) {\n return ctx.forbidden();\n }\n\n const fillFromLocaleService = getService('fill-from-locale');\n\n const rawDocument = await fillFromLocaleService.fetchRawDocument(\n model as UID.ContentType,\n sourceLocale,\n documentId\n );\n\n if (!rawDocument) {\n return ctx.notFound();\n }\n\n // Field-level filtering: strip fields the user cannot read on this content type\n const sanitizedDocument = await permissionChecker.sanitizeOutput(rawDocument);\n\n // Transform relations to target locale, skipping those the user cannot read\n const data = await fillFromLocaleService.transformDocument(\n sanitizedDocument as Record<string, unknown>,\n model as UID.ContentType,\n targetLocale,\n userAbility\n );\n\n ctx.body = { data };\n },\n} satisfies Core.Controller;\n\nexport default controller;\n"],"names":["ApplicationError","errors","PUBLISHED_AT_ATTRIBUTE","contentTypesUtils","constants","getLocalesProperty","getOr","getFieldsProperty","prop","getFirstLevelPath","map","path","split","controller","getNonLocalizedAttributes","ctx","user","userAbility","state","body","request","model","id","locale","validateGetNonLocalizedAttributesInput","permissionChecker","strapi","plugin","service","create","cannot","read","forbidden","copyNonLocalizedAttributes","isLocalizedContentType","getNestedPopulateOfNonLocalizedAttributes","getService","default","READ_ACTION","CREATE_ACTION","modelDef","contentType","attributesToPopulate","params","kind","entity","db","query","findOne","where","populate","notFound","permissions","admin","services","permission","findMany","action","subject","role","roles","localePermissions","filter","perm","includes","permittedFields","pipe","flatten","uniq","nonLocalizedFields","pickedFields","pick","sanitizedNonLocalizedFields","Object","fromEntries","entries","key","attribute","attributes","type","target","can","availableLocalesResult","plugins","getMetadata","availableLocales","localeResult","localizations","concat","getFillFromLocaleData","validateFillFromLocaleInput","documentId","sourceLocale","targetLocale","fillFromLocaleService","rawDocument","fetchRawDocument","sanitizedDocument","sanitizeOutput","data","transformDocument"],"mappings":"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"}
@@ -95,6 +95,24 @@ var admin = {
95
95
  ]
96
96
  }
97
97
  },
98
+ {
99
+ method: 'GET',
100
+ path: '/content-manager/get-fill-from-locale/:model',
101
+ handler: 'content-types.getFillFromLocaleData',
102
+ config: {
103
+ policies: [
104
+ 'admin::isAuthenticatedAdmin',
105
+ {
106
+ name: 'plugin::content-manager.hasPermissions',
107
+ config: {
108
+ actions: [
109
+ 'plugin::content-manager.explorer.read'
110
+ ]
111
+ }
112
+ }
113
+ ]
114
+ }
115
+ },
98
116
  {
99
117
  method: 'GET',
100
118
  path: '/settings',
@@ -1 +1 @@
1
- {"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":";;AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,4BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA2B;AAAC;AAClD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,mDAAA;YACNC,OAAAA,EAAS,yCAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,yBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iEAAA;YACNC,OAAAA,EAAS,8CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iDAAA;YACNC,OAAAA,EAAS,0CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"admin.js","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/content-manager/get-fill-from-locale/:model',\n handler: 'content-types.getFillFromLocaleData',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::content-manager.explorer.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"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"}
@@ -93,6 +93,24 @@ var admin = {
93
93
  ]
94
94
  }
95
95
  },
96
+ {
97
+ method: 'GET',
98
+ path: '/content-manager/get-fill-from-locale/:model',
99
+ handler: 'content-types.getFillFromLocaleData',
100
+ config: {
101
+ policies: [
102
+ 'admin::isAuthenticatedAdmin',
103
+ {
104
+ name: 'plugin::content-manager.hasPermissions',
105
+ config: {
106
+ actions: [
107
+ 'plugin::content-manager.explorer.read'
108
+ ]
109
+ }
110
+ }
111
+ ]
112
+ }
113
+ },
96
114
  {
97
115
  method: 'GET',
98
116
  path: '/settings',
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"AAAA,YAAe;IACbA,IAAAA,EAAM,OAAA;IACNC,MAAAA,EAAQ;AACN,QAAA;YACEC,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,4BAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA2B;AAAC;AAClD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,qBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,UAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,QAAA;YACRC,IAAAA,EAAM,cAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AACR,oBAAA,6BAAA;AACA,oBAAA;wBACEC,IAAAA,EAAM,wCAAA;wBACNF,MAAAA,EAAQ;4BAAEG,OAAAA,EAAS;AAAC,gCAAA;AAA6B;AAAC;AACpD;AACD;AACH;AACF,SAAA;AACA,QAAA;YACEN,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAM,mDAAA;YACNC,OAAAA,EAAS,yCAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,sBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,WAAA;YACNC,OAAAA,EAAS,yBAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iEAAA;YACNC,OAAAA,EAAS,8CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF,SAAA;AACA,QAAA;YACEJ,MAAAA,EAAQ,KAAA;YACRC,IAAAA,EAAM,iDAAA;YACNC,OAAAA,EAAS,0CAAA;YACTC,MAAAA,EAAQ;gBACNC,QAAAA,EAAU;AAAC,oBAAA;AAA8B;AAC3C;AACF;AACD;AACH,CAAA;;;;"}
1
+ {"version":3,"file":"admin.mjs","sources":["../../../server/src/routes/admin.ts"],"sourcesContent":["export default {\n type: 'admin',\n routes: [\n {\n method: 'GET',\n path: '/iso-locales',\n handler: 'iso-locales.listIsoLocales',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/locales',\n handler: 'locales.listLocales',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'POST',\n path: '/locales',\n handler: 'locales.createLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.create'] },\n },\n ],\n },\n },\n {\n method: 'PUT',\n path: '/locales/:id',\n handler: 'locales.updateLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.update'] },\n },\n ],\n },\n },\n {\n method: 'DELETE',\n path: '/locales/:id',\n handler: 'locales.deleteLocale',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::i18n.locale.delete'] },\n },\n ],\n },\n },\n {\n method: 'POST',\n path: '/content-manager/actions/get-non-localized-fields',\n handler: 'content-types.getNonLocalizedAttributes',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/content-manager/get-fill-from-locale/:model',\n handler: 'content-types.getFillFromLocaleData',\n config: {\n policies: [\n 'admin::isAuthenticatedAdmin',\n {\n name: 'plugin::content-manager.hasPermissions',\n config: { actions: ['plugin::content-manager.explorer.read'] },\n },\n ],\n },\n },\n {\n method: 'GET',\n path: '/settings',\n handler: 'settings.getSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'PUT',\n path: '/settings',\n handler: 'settings.updateSettings',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/collection-types/:contentType/:documentId',\n handler: 'ai-localization-jobs.getJobForCollectionType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n {\n method: 'GET',\n path: '/ai-localization-jobs/single-types/:contentType',\n handler: 'ai-localization-jobs.getJobForSingleType',\n config: {\n policies: ['admin::isAuthenticatedAdmin'],\n },\n },\n ],\n};\n"],"names":["type","routes","method","path","handler","config","policies","name","actions"],"mappings":"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"}