@roxxel/payload-multilang 0.0.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.
- package/README.md +165 -0
- package/dist/components/LanguageListToolbar.d.ts +6 -0
- package/dist/components/LanguageListToolbar.js +69 -0
- package/dist/components/LanguageListToolbar.js.map +1 -0
- package/dist/components/LanguageMetabox.d.ts +2 -0
- package/dist/components/LanguageMetabox.js +275 -0
- package/dist/components/LanguageMetabox.js.map +1 -0
- package/dist/components/TranslationActionsClient.d.ts +10 -0
- package/dist/components/TranslationActionsClient.js +166 -0
- package/dist/components/TranslationActionsClient.js.map +1 -0
- package/dist/components/TranslationColumnCell.d.ts +2 -0
- package/dist/components/TranslationColumnCell.js +69 -0
- package/dist/components/TranslationColumnCell.js.map +1 -0
- package/dist/components/TranslationColumnCellClient.d.ts +12 -0
- package/dist/components/TranslationColumnCellClient.js +107 -0
- package/dist/components/TranslationColumnCellClient.js.map +1 -0
- package/dist/components/TranslationsTab.d.ts +2 -0
- package/dist/components/TranslationsTab.js +118 -0
- package/dist/components/TranslationsTab.js.map +1 -0
- package/dist/components/config.d.ts +40 -0
- package/dist/components/config.js +31 -0
- package/dist/components/config.js.map +1 -0
- package/dist/constants.d.ts +5 -0
- package/dist/constants.js +24 -0
- package/dist/constants.js.map +1 -0
- package/dist/endpoints/translations.d.ts +19 -0
- package/dist/endpoints/translations.js +301 -0
- package/dist/endpoints/translations.js.map +1 -0
- package/dist/exports/client.d.ts +4 -0
- package/dist/exports/client.js +6 -0
- package/dist/exports/client.js.map +1 -0
- package/dist/exports/rsc.d.ts +2 -0
- package/dist/exports/rsc.js +4 -0
- package/dist/exports/rsc.js.map +1 -0
- package/dist/hooks/translatedCollection.d.ts +26 -0
- package/dist/hooks/translatedCollection.js +290 -0
- package/dist/hooks/translatedCollection.js.map +1 -0
- package/dist/hooks/translatedGlobal.d.ts +16 -0
- package/dist/hooks/translatedGlobal.js +71 -0
- package/dist/hooks/translatedGlobal.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/config.d.ts +14 -0
- package/dist/lib/config.js +96 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/data.d.ts +107 -0
- package/dist/lib/data.js +307 -0
- package/dist/lib/data.js.map +1 -0
- package/dist/payload-config.d.js +2 -0
- package/dist/payload-config.d.js.map +1 -0
- package/dist/styles/admin.css +316 -0
- package/dist/types.d.ts +96 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/docs/assets/admin-ui/collection-list-language-shortcuts.png +0 -0
- package/docs/assets/admin-ui/english-post-translations.png +0 -0
- package/docs/assets/admin-ui/ukrainian-post-translations.png +0 -0
- package/docs/configuration.md +192 -0
- package/docs/helpers.md +231 -0
- package/docs/usage.md +269 -0
- package/package.json +95 -0
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Button, toast, useConfig, useRouteTransition } from '@payloadcms/ui';
|
|
4
|
+
import { useRouter } from 'next/navigation.js';
|
|
5
|
+
import { formatAdminURL } from 'payload/shared';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import '../styles/admin.css';
|
|
8
|
+
export const TranslationActionsClient = ({ collectionSlug, docID, languages, state })=>{
|
|
9
|
+
const { config } = useConfig();
|
|
10
|
+
const router = useRouter();
|
|
11
|
+
const { startRouteTransition } = useRouteTransition();
|
|
12
|
+
const [targetLanguage, setTargetLanguage] = useState('');
|
|
13
|
+
const [targetID, setTargetID] = useState('');
|
|
14
|
+
const [isBusy, setIsBusy] = useState(false);
|
|
15
|
+
const collectionAPIPath = (path)=>formatAdminURL({
|
|
16
|
+
apiRoute: config.routes.api,
|
|
17
|
+
path: `/${collectionSlug}${path}`
|
|
18
|
+
});
|
|
19
|
+
const createTranslation = async ()=>{
|
|
20
|
+
if (!targetLanguage) {
|
|
21
|
+
toast.error('Choose a target language.');
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setIsBusy(true);
|
|
25
|
+
const response = await fetch(collectionAPIPath('/multilang/create'), {
|
|
26
|
+
body: JSON.stringify({
|
|
27
|
+
sourceId: docID,
|
|
28
|
+
targetLanguage
|
|
29
|
+
}),
|
|
30
|
+
credentials: 'include',
|
|
31
|
+
headers: {
|
|
32
|
+
'Content-Type': 'application/json'
|
|
33
|
+
},
|
|
34
|
+
method: 'POST'
|
|
35
|
+
});
|
|
36
|
+
setIsBusy(false);
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
const result = await response.json().catch(()=>undefined);
|
|
39
|
+
toast.error(result?.message || 'Translation could not be created.');
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
const result = await response.json();
|
|
43
|
+
const documentID = result.doc?.id;
|
|
44
|
+
if (documentID) {
|
|
45
|
+
startRouteTransition(()=>{
|
|
46
|
+
router.push(formatAdminURL({
|
|
47
|
+
adminRoute: config.routes.admin,
|
|
48
|
+
path: `/collections/${collectionSlug}/${documentID}`
|
|
49
|
+
}));
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
const connectTranslation = async ()=>{
|
|
54
|
+
if (!targetID || !targetLanguage) {
|
|
55
|
+
toast.error('Target ID and language are required.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
setIsBusy(true);
|
|
59
|
+
const response = await fetch(collectionAPIPath('/multilang/connect'), {
|
|
60
|
+
body: JSON.stringify({
|
|
61
|
+
sourceId: docID,
|
|
62
|
+
targetId: targetID,
|
|
63
|
+
targetLanguage
|
|
64
|
+
}),
|
|
65
|
+
credentials: 'include',
|
|
66
|
+
headers: {
|
|
67
|
+
'Content-Type': 'application/json'
|
|
68
|
+
},
|
|
69
|
+
method: 'POST'
|
|
70
|
+
});
|
|
71
|
+
setIsBusy(false);
|
|
72
|
+
if (!response.ok) {
|
|
73
|
+
const result = await response.json().catch(()=>undefined);
|
|
74
|
+
toast.error(result?.message || 'Translation could not be connected.');
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
toast.success('Translation connected.');
|
|
78
|
+
startRouteTransition(()=>{
|
|
79
|
+
router.refresh();
|
|
80
|
+
});
|
|
81
|
+
};
|
|
82
|
+
const disconnectTranslation = async ()=>{
|
|
83
|
+
setIsBusy(true);
|
|
84
|
+
const response = await fetch(collectionAPIPath('/multilang/disconnect'), {
|
|
85
|
+
body: JSON.stringify({
|
|
86
|
+
id: docID
|
|
87
|
+
}),
|
|
88
|
+
credentials: 'include',
|
|
89
|
+
headers: {
|
|
90
|
+
'Content-Type': 'application/json'
|
|
91
|
+
},
|
|
92
|
+
method: 'POST'
|
|
93
|
+
});
|
|
94
|
+
setIsBusy(false);
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
toast.error('Translation could not be disconnected.');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
toast.success('Translation disconnected.');
|
|
100
|
+
startRouteTransition(()=>{
|
|
101
|
+
router.refresh();
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
const availableLanguages = languages.filter((language)=>!state.translations[language.code]);
|
|
105
|
+
return /*#__PURE__*/ _jsxs("section", {
|
|
106
|
+
className: "payload-multilang-panel",
|
|
107
|
+
children: [
|
|
108
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
109
|
+
children: "Translation actions"
|
|
110
|
+
}),
|
|
111
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
112
|
+
className: "payload-multilang-inline-form",
|
|
113
|
+
children: [
|
|
114
|
+
/*#__PURE__*/ _jsxs("select", {
|
|
115
|
+
onChange: (event)=>setTargetLanguage(event.target.value),
|
|
116
|
+
value: targetLanguage,
|
|
117
|
+
children: [
|
|
118
|
+
/*#__PURE__*/ _jsx("option", {
|
|
119
|
+
value: "",
|
|
120
|
+
children: "Choose language"
|
|
121
|
+
}),
|
|
122
|
+
availableLanguages.map((language)=>/*#__PURE__*/ _jsxs("option", {
|
|
123
|
+
value: language.code,
|
|
124
|
+
children: [
|
|
125
|
+
language.flagLabel ? `${language.flagLabel} ` : '',
|
|
126
|
+
language.name
|
|
127
|
+
]
|
|
128
|
+
}, language.code))
|
|
129
|
+
]
|
|
130
|
+
}),
|
|
131
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
132
|
+
disabled: isBusy || !targetLanguage,
|
|
133
|
+
onClick: createTranslation,
|
|
134
|
+
type: "button",
|
|
135
|
+
children: "Create translation"
|
|
136
|
+
})
|
|
137
|
+
]
|
|
138
|
+
}),
|
|
139
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
140
|
+
className: "payload-multilang-inline-form",
|
|
141
|
+
children: [
|
|
142
|
+
/*#__PURE__*/ _jsx("input", {
|
|
143
|
+
onChange: (event)=>setTargetID(event.target.value),
|
|
144
|
+
placeholder: "Existing document ID",
|
|
145
|
+
value: targetID
|
|
146
|
+
}),
|
|
147
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
148
|
+
disabled: isBusy || !targetID || !targetLanguage,
|
|
149
|
+
onClick: connectTranslation,
|
|
150
|
+
type: "button",
|
|
151
|
+
children: "Connect existing"
|
|
152
|
+
})
|
|
153
|
+
]
|
|
154
|
+
}),
|
|
155
|
+
/*#__PURE__*/ _jsx(Button, {
|
|
156
|
+
buttonStyle: "secondary",
|
|
157
|
+
disabled: isBusy,
|
|
158
|
+
onClick: disconnectTranslation,
|
|
159
|
+
type: "button",
|
|
160
|
+
children: "Disconnect this document"
|
|
161
|
+
})
|
|
162
|
+
]
|
|
163
|
+
});
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
//# sourceMappingURL=TranslationActionsClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/TranslationActionsClient.tsx"],"sourcesContent":["'use client'\n\nimport { Button, toast, useConfig, useRouteTransition } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport { useState } from 'react'\n\nimport '../styles/admin.css'\nimport type { MultilangLanguage, TranslationState } from '../types.js'\n\ntype Props = {\n collectionSlug: string\n docID: number | string\n languages: MultilangLanguage[]\n state: TranslationState\n}\n\nexport const TranslationActionsClient = ({\n collectionSlug,\n docID,\n languages,\n state,\n}: Props) => {\n const { config } = useConfig()\n const router = useRouter()\n const { startRouteTransition } = useRouteTransition()\n const [targetLanguage, setTargetLanguage] = useState('')\n const [targetID, setTargetID] = useState('')\n const [isBusy, setIsBusy] = useState(false)\n\n const collectionAPIPath = (path: string) =>\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collectionSlug}${path}`,\n })\n\n const createTranslation = async () => {\n if (!targetLanguage) {\n toast.error('Choose a target language.')\n return\n }\n\n setIsBusy(true)\n const response = await fetch(collectionAPIPath('/multilang/create'), {\n body: JSON.stringify({\n sourceId: docID,\n targetLanguage,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n setIsBusy(false)\n\n if (!response.ok) {\n const result = (await response.json().catch(() => undefined)) as\n | { message?: string }\n | undefined\n toast.error(result?.message || 'Translation could not be created.')\n return\n }\n\n const result = (await response.json()) as { doc?: { id?: number | string } }\n\n const documentID = result.doc?.id\n\n if (documentID) {\n startRouteTransition(() => {\n router.push(\n formatAdminURL({\n adminRoute: config.routes.admin,\n path: `/collections/${collectionSlug}/${documentID}`,\n }),\n )\n })\n }\n }\n\n const connectTranslation = async () => {\n if (!targetID || !targetLanguage) {\n toast.error('Target ID and language are required.')\n return\n }\n\n setIsBusy(true)\n const response = await fetch(collectionAPIPath('/multilang/connect'), {\n body: JSON.stringify({\n sourceId: docID,\n targetId: targetID,\n targetLanguage,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n setIsBusy(false)\n\n if (!response.ok) {\n const result = (await response.json().catch(() => undefined)) as\n | { message?: string }\n | undefined\n toast.error(result?.message || 'Translation could not be connected.')\n return\n }\n\n toast.success('Translation connected.')\n startRouteTransition(() => {\n router.refresh()\n })\n }\n\n const disconnectTranslation = async () => {\n setIsBusy(true)\n const response = await fetch(collectionAPIPath('/multilang/disconnect'), {\n body: JSON.stringify({ id: docID }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n })\n setIsBusy(false)\n\n if (!response.ok) {\n toast.error('Translation could not be disconnected.')\n return\n }\n\n toast.success('Translation disconnected.')\n startRouteTransition(() => {\n router.refresh()\n })\n }\n\n const availableLanguages = languages.filter(\n (language) => !state.translations[language.code],\n )\n\n return (\n <section className=\"payload-multilang-panel\">\n <h2>Translation actions</h2>\n <div className=\"payload-multilang-inline-form\">\n <select\n onChange={(event) => setTargetLanguage(event.target.value)}\n value={targetLanguage}\n >\n <option value=\"\">Choose language</option>\n {availableLanguages.map((language) => (\n <option key={language.code} value={language.code}>\n {language.flagLabel ? `${language.flagLabel} ` : ''}\n {language.name}\n </option>\n ))}\n </select>\n <Button disabled={isBusy || !targetLanguage} onClick={createTranslation} type=\"button\">\n Create translation\n </Button>\n </div>\n\n <div className=\"payload-multilang-inline-form\">\n <input\n onChange={(event) => setTargetID(event.target.value)}\n placeholder=\"Existing document ID\"\n value={targetID}\n />\n <Button disabled={isBusy || !targetID || !targetLanguage} onClick={connectTranslation} type=\"button\">\n Connect existing\n </Button>\n </div>\n\n <Button buttonStyle=\"secondary\" disabled={isBusy} onClick={disconnectTranslation} type=\"button\">\n Disconnect this document\n </Button>\n </section>\n )\n}\n"],"names":["Button","toast","useConfig","useRouteTransition","useRouter","formatAdminURL","useState","TranslationActionsClient","collectionSlug","docID","languages","state","config","router","startRouteTransition","targetLanguage","setTargetLanguage","targetID","setTargetID","isBusy","setIsBusy","collectionAPIPath","path","apiRoute","routes","api","createTranslation","error","response","fetch","body","JSON","stringify","sourceId","credentials","headers","method","ok","result","json","catch","undefined","message","documentID","doc","id","push","adminRoute","admin","connectTranslation","targetId","success","refresh","disconnectTranslation","availableLanguages","filter","language","translations","code","section","className","h2","div","select","onChange","event","target","value","option","map","flagLabel","name","disabled","onClick","type","input","placeholder","buttonStyle"],"mappings":"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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DEFAULT_FIELD_NAMES } from '../constants.js';
|
|
3
|
+
import { asDocument, getID, getStringValue } from '../lib/data.js';
|
|
4
|
+
import { getPayloadMultilangCustom } from './config.js';
|
|
5
|
+
import { TranslationColumnCellClient } from './TranslationColumnCellClient.js';
|
|
6
|
+
const getCollectionConfig = (props)=>props.collectionConfig || props.payload.collections[props.collectionSlug]?.config;
|
|
7
|
+
const getFieldNames = (props)=>({
|
|
8
|
+
...DEFAULT_FIELD_NAMES,
|
|
9
|
+
...getPayloadMultilangCustom(getCollectionConfig(props)?.admin?.custom).fieldNames || {}
|
|
10
|
+
});
|
|
11
|
+
const getLanguages = (props)=>{
|
|
12
|
+
const languages = getPayloadMultilangCustom(getCollectionConfig(props)?.admin?.custom).languages;
|
|
13
|
+
return Array.isArray(languages) ? languages : [];
|
|
14
|
+
};
|
|
15
|
+
export const TranslationColumnCell = async (props)=>{
|
|
16
|
+
const fieldNames = getFieldNames(props);
|
|
17
|
+
const languages = getLanguages(props);
|
|
18
|
+
const collectionConfig = getCollectionConfig(props);
|
|
19
|
+
const rowData = asDocument(props.rowData);
|
|
20
|
+
const sourceID = getID(rowData.id);
|
|
21
|
+
const configuredLanguageCodes = new Set(languages.map((language)=>language.code));
|
|
22
|
+
if (!collectionConfig || !languages.length || !sourceID) {
|
|
23
|
+
return /*#__PURE__*/ _jsx("span", {
|
|
24
|
+
className: "payload-multilang-cell payload-multilang-cell--muted",
|
|
25
|
+
children: "-"
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
const storedLanguage = getStringValue(rowData[fieldNames.language]);
|
|
29
|
+
const currentLanguage = storedLanguage && configuredLanguageCodes.has(storedLanguage) ? storedLanguage : undefined;
|
|
30
|
+
const group = getStringValue(rowData[fieldNames.group]);
|
|
31
|
+
let translationsByLanguage = {};
|
|
32
|
+
if (group) {
|
|
33
|
+
const { docs } = await props.payload.find({
|
|
34
|
+
collection: collectionConfig.slug,
|
|
35
|
+
depth: 0,
|
|
36
|
+
limit: 200,
|
|
37
|
+
overrideAccess: true,
|
|
38
|
+
where: {
|
|
39
|
+
[fieldNames.group]: {
|
|
40
|
+
equals: group
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
translationsByLanguage = docs.reduce((acc, doc)=>{
|
|
45
|
+
const data = asDocument(doc);
|
|
46
|
+
const language = getStringValue(data[fieldNames.language]);
|
|
47
|
+
const id = getID(data.id);
|
|
48
|
+
if (language && id) {
|
|
49
|
+
acc[language] = id;
|
|
50
|
+
}
|
|
51
|
+
return acc;
|
|
52
|
+
}, {});
|
|
53
|
+
}
|
|
54
|
+
return /*#__PURE__*/ _jsx("div", {
|
|
55
|
+
className: "payload-multilang-column-stack",
|
|
56
|
+
title: currentLanguage ? undefined : storedLanguage ? `Unassigned; stored language "${storedLanguage}" is not configured` : 'Unassigned',
|
|
57
|
+
children: languages.map((language)=>/*#__PURE__*/ _jsx(TranslationColumnCellClient, {
|
|
58
|
+
collectionSlug: collectionConfig.slug,
|
|
59
|
+
current: currentLanguage === language.code,
|
|
60
|
+
flagLabel: language.flagLabel,
|
|
61
|
+
sourceID: sourceID,
|
|
62
|
+
targetLanguage: language.code,
|
|
63
|
+
targetLanguageName: language.name,
|
|
64
|
+
translationID: translationsByLanguage[language.code]
|
|
65
|
+
}, language.code))
|
|
66
|
+
});
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=TranslationColumnCell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/TranslationColumnCell.tsx"],"sourcesContent":["import type { CollectionSlug, DefaultServerCellComponentProps } from 'payload'\n\nimport { DEFAULT_FIELD_NAMES } from '../constants.js'\nimport { asDocument, getID, getStringValue } from '../lib/data.js'\nimport type { MultilangFieldNames, MultilangLanguage } from '../types.js'\nimport { getPayloadMultilangCustom } from './config.js'\nimport { TranslationColumnCellClient } from './TranslationColumnCellClient.js'\n\nconst getCollectionConfig = (props: DefaultServerCellComponentProps) =>\n props.collectionConfig || props.payload.collections[props.collectionSlug]?.config\n\nconst getFieldNames = (\n props: DefaultServerCellComponentProps,\n): MultilangFieldNames => ({\n ...DEFAULT_FIELD_NAMES,\n ...(getPayloadMultilangCustom(getCollectionConfig(props)?.admin?.custom)\n .fieldNames || {}),\n})\n\nconst getLanguages = (\n props: DefaultServerCellComponentProps,\n): MultilangLanguage[] => {\n const languages = getPayloadMultilangCustom(\n getCollectionConfig(props)?.admin?.custom,\n ).languages\n\n return Array.isArray(languages) ? languages : []\n}\n\nexport const TranslationColumnCell = async (\n props: DefaultServerCellComponentProps,\n) => {\n const fieldNames = getFieldNames(props)\n const languages = getLanguages(props)\n const collectionConfig = getCollectionConfig(props)\n const rowData = asDocument(props.rowData)\n const sourceID = getID(rowData.id)\n const configuredLanguageCodes = new Set(languages.map((language) => language.code))\n\n if (!collectionConfig || !languages.length || !sourceID) {\n return (\n <span className=\"payload-multilang-cell payload-multilang-cell--muted\">\n -\n </span>\n )\n }\n\n const storedLanguage = getStringValue(rowData[fieldNames.language])\n const currentLanguage =\n storedLanguage && configuredLanguageCodes.has(storedLanguage)\n ? storedLanguage\n : undefined\n const group = getStringValue(rowData[fieldNames.group])\n let translationsByLanguage: Record<string, number | string> = {}\n\n if (group) {\n const { docs } = await props.payload.find({\n collection: collectionConfig.slug as CollectionSlug,\n depth: 0,\n limit: 200,\n overrideAccess: true,\n where: {\n [fieldNames.group]: {\n equals: group,\n },\n },\n })\n\n translationsByLanguage = docs.reduce<Record<string, number | string>>(\n (acc, doc) => {\n const data = asDocument(doc)\n const language = getStringValue(data[fieldNames.language])\n const id = getID(data.id)\n\n if (language && id) {\n acc[language] = id\n }\n\n return acc\n },\n {},\n )\n }\n\n return (\n <div\n className=\"payload-multilang-column-stack\"\n title={\n currentLanguage\n ? undefined\n : storedLanguage\n ? `Unassigned; stored language \"${storedLanguage}\" is not configured`\n : 'Unassigned'\n }\n >\n {languages.map((language) => (\n <TranslationColumnCellClient\n collectionSlug={collectionConfig.slug}\n current={currentLanguage === language.code}\n flagLabel={language.flagLabel}\n key={language.code}\n sourceID={sourceID}\n targetLanguage={language.code}\n targetLanguageName={language.name}\n translationID={translationsByLanguage[language.code]}\n />\n ))}\n </div>\n )\n}\n"],"names":["DEFAULT_FIELD_NAMES","asDocument","getID","getStringValue","getPayloadMultilangCustom","TranslationColumnCellClient","getCollectionConfig","props","collectionConfig","payload","collections","collectionSlug","config","getFieldNames","admin","custom","fieldNames","getLanguages","languages","Array","isArray","TranslationColumnCell","rowData","sourceID","id","configuredLanguageCodes","Set","map","language","code","length","span","className","storedLanguage","currentLanguage","has","undefined","group","translationsByLanguage","docs","find","collection","slug","depth","limit","overrideAccess","where","equals","reduce","acc","doc","data","div","title","current","flagLabel","targetLanguage","targetLanguageName","name","translationID"],"mappings":";AAEA,SAASA,mBAAmB,QAAQ,kBAAiB;AACrD,SAASC,UAAU,EAAEC,KAAK,EAAEC,cAAc,QAAQ,iBAAgB;AAElE,SAASC,yBAAyB,QAAQ,cAAa;AACvD,SAASC,2BAA2B,QAAQ,mCAAkC;AAE9E,MAAMC,sBAAsB,CAACC,QAC3BA,MAAMC,gBAAgB,IAAID,MAAME,OAAO,CAACC,WAAW,CAACH,MAAMI,cAAc,CAAC,EAAEC;AAE7E,MAAMC,gBAAgB,CACpBN,QACyB,CAAA;QACzB,GAAGP,mBAAmB;QACtB,GAAII,0BAA0BE,oBAAoBC,QAAQO,OAAOC,QAC9DC,UAAU,IAAI,CAAC,CAAC;IACrB,CAAA;AAEA,MAAMC,eAAe,CACnBV;IAEA,MAAMW,YAAYd,0BAChBE,oBAAoBC,QAAQO,OAAOC,QACnCG,SAAS;IAEX,OAAOC,MAAMC,OAAO,CAACF,aAAaA,YAAY,EAAE;AAClD;AAEA,OAAO,MAAMG,wBAAwB,OACnCd;IAEA,MAAMS,aAAaH,cAAcN;IACjC,MAAMW,YAAYD,aAAaV;IAC/B,MAAMC,mBAAmBF,oBAAoBC;IAC7C,MAAMe,UAAUrB,WAAWM,MAAMe,OAAO;IACxC,MAAMC,WAAWrB,MAAMoB,QAAQE,EAAE;IACjC,MAAMC,0BAA0B,IAAIC,IAAIR,UAAUS,GAAG,CAAC,CAACC,WAAaA,SAASC,IAAI;IAEjF,IAAI,CAACrB,oBAAoB,CAACU,UAAUY,MAAM,IAAI,CAACP,UAAU;QACvD,qBACE,KAACQ;YAAKC,WAAU;sBAAuD;;IAI3E;IAEA,MAAMC,iBAAiB9B,eAAemB,OAAO,CAACN,WAAWY,QAAQ,CAAC;IAClE,MAAMM,kBACJD,kBAAkBR,wBAAwBU,GAAG,CAACF,kBAC1CA,iBACAG;IACN,MAAMC,QAAQlC,eAAemB,OAAO,CAACN,WAAWqB,KAAK,CAAC;IACtD,IAAIC,yBAA0D,CAAC;IAE/D,IAAID,OAAO;QACT,MAAM,EAAEE,IAAI,EAAE,GAAG,MAAMhC,MAAME,OAAO,CAAC+B,IAAI,CAAC;YACxCC,YAAYjC,iBAAiBkC,IAAI;YACjCC,OAAO;YACPC,OAAO;YACPC,gBAAgB;YAChBC,OAAO;gBACL,CAAC9B,WAAWqB,KAAK,CAAC,EAAE;oBAClBU,QAAQV;gBACV;YACF;QACF;QAEAC,yBAAyBC,KAAKS,MAAM,CAClC,CAACC,KAAKC;YACJ,MAAMC,OAAOlD,WAAWiD;YACxB,MAAMtB,WAAWzB,eAAegD,IAAI,CAACnC,WAAWY,QAAQ,CAAC;YACzD,MAAMJ,KAAKtB,MAAMiD,KAAK3B,EAAE;YAExB,IAAII,YAAYJ,IAAI;gBAClByB,GAAG,CAACrB,SAAS,GAAGJ;YAClB;YAEA,OAAOyB;QACT,GACA,CAAC;IAEL;IAEA,qBACE,KAACG;QACCpB,WAAU;QACVqB,OACEnB,kBACIE,YACAH,iBACE,CAAC,6BAA6B,EAAEA,eAAe,mBAAmB,CAAC,GACnE;kBAGPf,UAAUS,GAAG,CAAC,CAACC,yBACd,KAACvB;gBACCM,gBAAgBH,iBAAiBkC,IAAI;gBACrCY,SAASpB,oBAAoBN,SAASC,IAAI;gBAC1C0B,WAAW3B,SAAS2B,SAAS;gBAE7BhC,UAAUA;gBACViC,gBAAgB5B,SAASC,IAAI;gBAC7B4B,oBAAoB7B,SAAS8B,IAAI;gBACjCC,eAAerB,sBAAsB,CAACV,SAASC,IAAI,CAAC;eAJ/CD,SAASC,IAAI;;AAS5B,EAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import '../styles/admin.css';
|
|
2
|
+
type Props = {
|
|
3
|
+
collectionSlug: string;
|
|
4
|
+
current?: boolean;
|
|
5
|
+
flagLabel?: string;
|
|
6
|
+
sourceID?: number | string;
|
|
7
|
+
targetLanguage: string;
|
|
8
|
+
targetLanguageName: string;
|
|
9
|
+
translationID?: number | string;
|
|
10
|
+
};
|
|
11
|
+
export declare const TranslationColumnCellClient: ({ collectionSlug, current, flagLabel, sourceID, targetLanguage, targetLanguageName, translationID, }: Props) => import("react/jsx-runtime").JSX.Element;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { toast, useConfig, useRouteTransition } from '@payloadcms/ui';
|
|
4
|
+
import { useRouter } from 'next/navigation.js';
|
|
5
|
+
import { formatAdminURL } from 'payload/shared';
|
|
6
|
+
import { useState } from 'react';
|
|
7
|
+
import '../styles/admin.css';
|
|
8
|
+
const PenIcon = ()=>/*#__PURE__*/ _jsxs("svg", {
|
|
9
|
+
"aria-hidden": "true",
|
|
10
|
+
className: "payload-multilang-pen-icon",
|
|
11
|
+
fill: "none",
|
|
12
|
+
height: "16",
|
|
13
|
+
viewBox: "0 0 16 16",
|
|
14
|
+
width: "16",
|
|
15
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
16
|
+
children: [
|
|
17
|
+
/*#__PURE__*/ _jsx("path", {
|
|
18
|
+
d: "M9.9 2.6 13.4 6 5.7 13.7 2.2 14.4 2.9 10.9 9.9 2.6Z",
|
|
19
|
+
stroke: "currentColor",
|
|
20
|
+
strokeLinejoin: "round",
|
|
21
|
+
strokeWidth: "1.4"
|
|
22
|
+
}),
|
|
23
|
+
/*#__PURE__*/ _jsx("path", {
|
|
24
|
+
d: "M8.8 3.9 12.1 7.2",
|
|
25
|
+
stroke: "currentColor",
|
|
26
|
+
strokeLinecap: "round",
|
|
27
|
+
strokeWidth: "1.4"
|
|
28
|
+
})
|
|
29
|
+
]
|
|
30
|
+
});
|
|
31
|
+
export const TranslationColumnCellClient = ({ collectionSlug, current, flagLabel, sourceID, targetLanguage, targetLanguageName, translationID })=>{
|
|
32
|
+
const { config } = useConfig();
|
|
33
|
+
const router = useRouter();
|
|
34
|
+
const { isTransitioning, startRouteTransition } = useRouteTransition();
|
|
35
|
+
const [isBusy, setIsBusy] = useState(false);
|
|
36
|
+
const documentURL = (documentID)=>formatAdminURL({
|
|
37
|
+
adminRoute: config.routes.admin,
|
|
38
|
+
path: `/collections/${collectionSlug}/${documentID}`
|
|
39
|
+
});
|
|
40
|
+
const navigateToTranslation = (documentID)=>{
|
|
41
|
+
startRouteTransition(()=>{
|
|
42
|
+
router.push(documentURL(documentID));
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
const createTranslation = async ()=>{
|
|
46
|
+
if (!sourceID) {
|
|
47
|
+
toast.error('Save the document before creating translations.');
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
setIsBusy(true);
|
|
51
|
+
const response = await fetch(formatAdminURL({
|
|
52
|
+
apiRoute: config.routes.api,
|
|
53
|
+
path: `/${collectionSlug}/multilang/create`
|
|
54
|
+
}), {
|
|
55
|
+
body: JSON.stringify({
|
|
56
|
+
sourceId: sourceID,
|
|
57
|
+
targetLanguage
|
|
58
|
+
}),
|
|
59
|
+
credentials: 'include',
|
|
60
|
+
headers: {
|
|
61
|
+
'Content-Type': 'application/json'
|
|
62
|
+
},
|
|
63
|
+
method: 'POST'
|
|
64
|
+
});
|
|
65
|
+
setIsBusy(false);
|
|
66
|
+
if (!response.ok) {
|
|
67
|
+
const result = await response.json().catch(()=>undefined);
|
|
68
|
+
toast.error(result?.message || 'Translation could not be created.');
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const result = await response.json();
|
|
72
|
+
if (result.doc?.id) {
|
|
73
|
+
navigateToTranslation(result.doc.id);
|
|
74
|
+
}
|
|
75
|
+
};
|
|
76
|
+
if (current) {
|
|
77
|
+
return /*#__PURE__*/ _jsx("span", {
|
|
78
|
+
className: "payload-multilang-flag-cell payload-multilang-flag-cell--current",
|
|
79
|
+
title: targetLanguageName,
|
|
80
|
+
children: flagLabel || targetLanguage.toUpperCase()
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
if (translationID) {
|
|
84
|
+
return /*#__PURE__*/ _jsx("a", {
|
|
85
|
+
className: "payload-multilang-cell-action",
|
|
86
|
+
href: documentURL(translationID),
|
|
87
|
+
onClick: (event)=>{
|
|
88
|
+
event.preventDefault();
|
|
89
|
+
navigateToTranslation(translationID);
|
|
90
|
+
},
|
|
91
|
+
"aria-label": `Edit ${targetLanguageName} translation`,
|
|
92
|
+
title: `Edit ${targetLanguageName} translation`,
|
|
93
|
+
children: /*#__PURE__*/ _jsx(PenIcon, {})
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
return /*#__PURE__*/ _jsx("button", {
|
|
97
|
+
"aria-label": `Create ${targetLanguageName} translation`,
|
|
98
|
+
className: "payload-multilang-icon-button",
|
|
99
|
+
disabled: !sourceID || isBusy || isTransitioning,
|
|
100
|
+
onClick: ()=>void createTranslation(),
|
|
101
|
+
title: `Create ${targetLanguageName} translation`,
|
|
102
|
+
type: "button",
|
|
103
|
+
children: "+"
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=TranslationColumnCellClient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/TranslationColumnCellClient.tsx"],"sourcesContent":["'use client'\n\nimport { toast, useConfig, useRouteTransition } from '@payloadcms/ui'\nimport { useRouter } from 'next/navigation.js'\nimport { formatAdminURL } from 'payload/shared'\nimport { useState } from 'react'\n\nimport '../styles/admin.css'\n\ntype Props = {\n collectionSlug: string\n current?: boolean\n flagLabel?: string\n sourceID?: number | string\n targetLanguage: string\n targetLanguageName: string\n translationID?: number | string\n}\n\nconst PenIcon = () => (\n <svg\n aria-hidden=\"true\"\n className=\"payload-multilang-pen-icon\"\n fill=\"none\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n width=\"16\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M9.9 2.6 13.4 6 5.7 13.7 2.2 14.4 2.9 10.9 9.9 2.6Z\"\n stroke=\"currentColor\"\n strokeLinejoin=\"round\"\n strokeWidth=\"1.4\"\n />\n <path\n d=\"M8.8 3.9 12.1 7.2\"\n stroke=\"currentColor\"\n strokeLinecap=\"round\"\n strokeWidth=\"1.4\"\n />\n </svg>\n)\n\nexport const TranslationColumnCellClient = ({\n collectionSlug,\n current,\n flagLabel,\n sourceID,\n targetLanguage,\n targetLanguageName,\n translationID,\n}: Props) => {\n const { config } = useConfig()\n const router = useRouter()\n const { isTransitioning, startRouteTransition } = useRouteTransition()\n const [isBusy, setIsBusy] = useState(false)\n\n const documentURL = (documentID: number | string) =>\n formatAdminURL({\n adminRoute: config.routes.admin,\n path: `/collections/${collectionSlug}/${documentID}`,\n })\n\n const navigateToTranslation = (documentID: number | string) => {\n startRouteTransition(() => {\n router.push(documentURL(documentID))\n })\n }\n\n const createTranslation = async () => {\n if (!sourceID) {\n toast.error('Save the document before creating translations.')\n return\n }\n\n setIsBusy(true)\n\n const response = await fetch(\n formatAdminURL({\n apiRoute: config.routes.api,\n path: `/${collectionSlug}/multilang/create`,\n }),\n {\n body: JSON.stringify({\n sourceId: sourceID,\n targetLanguage,\n }),\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json',\n },\n method: 'POST',\n },\n )\n\n setIsBusy(false)\n\n if (!response.ok) {\n const result = (await response.json().catch(() => undefined)) as\n | { message?: string }\n | undefined\n toast.error(result?.message || 'Translation could not be created.')\n return\n }\n\n const result = (await response.json()) as {\n doc?: { id?: number | string }\n }\n\n if (result.doc?.id) {\n navigateToTranslation(result.doc.id)\n }\n }\n\n if (current) {\n return (\n <span\n className=\"payload-multilang-flag-cell payload-multilang-flag-cell--current\"\n title={targetLanguageName}\n >\n {flagLabel || targetLanguage.toUpperCase()}\n </span>\n )\n }\n\n if (translationID) {\n return (\n <a\n className=\"payload-multilang-cell-action\"\n href={documentURL(translationID)}\n onClick={(event) => {\n event.preventDefault()\n navigateToTranslation(translationID)\n }}\n aria-label={`Edit ${targetLanguageName} translation`}\n title={`Edit ${targetLanguageName} translation`}\n >\n <PenIcon />\n </a>\n )\n }\n\n return (\n <button\n aria-label={`Create ${targetLanguageName} translation`}\n className=\"payload-multilang-icon-button\"\n disabled={!sourceID || isBusy || isTransitioning}\n onClick={() => void createTranslation()}\n title={`Create ${targetLanguageName} translation`}\n type=\"button\"\n >\n +\n </button>\n )\n}\n"],"names":["toast","useConfig","useRouteTransition","useRouter","formatAdminURL","useState","PenIcon","svg","aria-hidden","className","fill","height","viewBox","width","xmlns","path","d","stroke","strokeLinejoin","strokeWidth","strokeLinecap","TranslationColumnCellClient","collectionSlug","current","flagLabel","sourceID","targetLanguage","targetLanguageName","translationID","config","router","isTransitioning","startRouteTransition","isBusy","setIsBusy","documentURL","documentID","adminRoute","routes","admin","navigateToTranslation","push","createTranslation","error","response","fetch","apiRoute","api","body","JSON","stringify","sourceId","credentials","headers","method","ok","result","json","catch","undefined","message","doc","id","span","title","toUpperCase","a","href","onClick","event","preventDefault","aria-label","button","disabled","type"],"mappings":"AAAA;;AAEA,SAASA,KAAK,EAAEC,SAAS,EAAEC,kBAAkB,QAAQ,iBAAgB;AACrE,SAASC,SAAS,QAAQ,qBAAoB;AAC9C,SAASC,cAAc,QAAQ,iBAAgB;AAC/C,SAASC,QAAQ,QAAQ,QAAO;AAEhC,OAAO,sBAAqB;AAY5B,MAAMC,UAAU,kBACd,MAACC;QACCC,eAAY;QACZC,WAAU;QACVC,MAAK;QACLC,QAAO;QACPC,SAAQ;QACRC,OAAM;QACNC,OAAM;;0BAEN,KAACC;gBACCC,GAAE;gBACFC,QAAO;gBACPC,gBAAe;gBACfC,aAAY;;0BAEd,KAACJ;gBACCC,GAAE;gBACFC,QAAO;gBACPG,eAAc;gBACdD,aAAY;;;;AAKlB,OAAO,MAAME,8BAA8B,CAAC,EAC1CC,cAAc,EACdC,OAAO,EACPC,SAAS,EACTC,QAAQ,EACRC,cAAc,EACdC,kBAAkB,EAClBC,aAAa,EACP;IACN,MAAM,EAAEC,MAAM,EAAE,GAAG5B;IACnB,MAAM6B,SAAS3B;IACf,MAAM,EAAE4B,eAAe,EAAEC,oBAAoB,EAAE,GAAG9B;IAClD,MAAM,CAAC+B,QAAQC,UAAU,GAAG7B,SAAS;IAErC,MAAM8B,cAAc,CAACC,aACnBhC,eAAe;YACbiC,YAAYR,OAAOS,MAAM,CAACC,KAAK;YAC/BxB,MAAM,CAAC,aAAa,EAAEO,eAAe,CAAC,EAAEc,YAAY;QACtD;IAEF,MAAMI,wBAAwB,CAACJ;QAC7BJ,qBAAqB;YACnBF,OAAOW,IAAI,CAACN,YAAYC;QAC1B;IACF;IAEA,MAAMM,oBAAoB;QACxB,IAAI,CAACjB,UAAU;YACbzB,MAAM2C,KAAK,CAAC;YACZ;QACF;QAEAT,UAAU;QAEV,MAAMU,WAAW,MAAMC,MACrBzC,eAAe;YACb0C,UAAUjB,OAAOS,MAAM,CAACS,GAAG;YAC3BhC,MAAM,CAAC,CAAC,EAAEO,eAAe,iBAAiB,CAAC;QAC7C,IACA;YACE0B,MAAMC,KAAKC,SAAS,CAAC;gBACnBC,UAAU1B;gBACVC;YACF;YACA0B,aAAa;YACbC,SAAS;gBACP,gBAAgB;YAClB;YACAC,QAAQ;QACV;QAGFpB,UAAU;QAEV,IAAI,CAACU,SAASW,EAAE,EAAE;YAChB,MAAMC,SAAU,MAAMZ,SAASa,IAAI,GAAGC,KAAK,CAAC,IAAMC;YAGlD3D,MAAM2C,KAAK,CAACa,QAAQI,WAAW;YAC/B;QACF;QAEA,MAAMJ,SAAU,MAAMZ,SAASa,IAAI;QAInC,IAAID,OAAOK,GAAG,EAAEC,IAAI;YAClBtB,sBAAsBgB,OAAOK,GAAG,CAACC,EAAE;QACrC;IACF;IAEA,IAAIvC,SAAS;QACX,qBACE,KAACwC;YACCtD,WAAU;YACVuD,OAAOrC;sBAENH,aAAaE,eAAeuC,WAAW;;IAG9C;IAEA,IAAIrC,eAAe;QACjB,qBACE,KAACsC;YACCzD,WAAU;YACV0D,MAAMhC,YAAYP;YAClBwC,SAAS,CAACC;gBACRA,MAAMC,cAAc;gBACpB9B,sBAAsBZ;YACxB;YACA2C,cAAY,CAAC,KAAK,EAAE5C,mBAAmB,YAAY,CAAC;YACpDqC,OAAO,CAAC,KAAK,EAAErC,mBAAmB,YAAY,CAAC;sBAE/C,cAAA,KAACrB;;IAGP;IAEA,qBACE,KAACkE;QACCD,cAAY,CAAC,OAAO,EAAE5C,mBAAmB,YAAY,CAAC;QACtDlB,WAAU;QACVgE,UAAU,CAAChD,YAAYQ,UAAUF;QACjCqC,SAAS,IAAM,KAAK1B;QACpBsB,OAAO,CAAC,OAAO,EAAErC,mBAAmB,YAAY,CAAC;QACjD+C,MAAK;kBACN;;AAIL,EAAC"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { DEFAULT_FIELD_NAMES } from '../constants.js';
|
|
3
|
+
import { asDocument, getDocumentTranslationsWithPayload, getID } from '../lib/data.js';
|
|
4
|
+
import { getPayloadMultilangCustom } from './config.js';
|
|
5
|
+
import { TranslationActionsClient } from './TranslationActionsClient.js';
|
|
6
|
+
const getFieldNames = (props)=>{
|
|
7
|
+
const custom = props.initPageResult.collectionConfig?.admin?.custom;
|
|
8
|
+
return {
|
|
9
|
+
...DEFAULT_FIELD_NAMES,
|
|
10
|
+
...custom?.payloadMultilang?.fieldNames || {}
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
const getLanguages = (props)=>{
|
|
14
|
+
const languages = getPayloadMultilangCustom(props.initPageResult.collectionConfig?.admin?.custom).languages;
|
|
15
|
+
return Array.isArray(languages) ? languages : [];
|
|
16
|
+
};
|
|
17
|
+
export const TranslationsTab = async (props)=>{
|
|
18
|
+
const collectionSlug = props.initPageResult.collectionConfig?.slug;
|
|
19
|
+
const translationsSegmentIndex = props.routeSegments.lastIndexOf('translations');
|
|
20
|
+
const routeDocID = translationsSegmentIndex > 0 ? props.routeSegments[translationsSegmentIndex - 1] : undefined;
|
|
21
|
+
const docID = getID(asDocument(props.doc).id || routeDocID || props.id);
|
|
22
|
+
if (!collectionSlug || !docID) {
|
|
23
|
+
return /*#__PURE__*/ _jsxs("section", {
|
|
24
|
+
className: "payload-multilang-page",
|
|
25
|
+
children: [
|
|
26
|
+
/*#__PURE__*/ _jsx("h1", {
|
|
27
|
+
children: "Translations"
|
|
28
|
+
}),
|
|
29
|
+
/*#__PURE__*/ _jsx("p", {
|
|
30
|
+
children: "Save the document before managing translations."
|
|
31
|
+
})
|
|
32
|
+
]
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
const fieldNames = getFieldNames(props);
|
|
36
|
+
const languages = getLanguages(props);
|
|
37
|
+
const state = await getDocumentTranslationsWithPayload({
|
|
38
|
+
id: docID,
|
|
39
|
+
collection: collectionSlug,
|
|
40
|
+
fieldNames,
|
|
41
|
+
payload: props.payload
|
|
42
|
+
});
|
|
43
|
+
return /*#__PURE__*/ _jsxs("div", {
|
|
44
|
+
className: "payload-multilang-page",
|
|
45
|
+
"data-testid": "multilang-translations-tab",
|
|
46
|
+
children: [
|
|
47
|
+
/*#__PURE__*/ _jsx("header", {
|
|
48
|
+
className: "payload-multilang-page__header",
|
|
49
|
+
children: /*#__PURE__*/ _jsxs("div", {
|
|
50
|
+
children: [
|
|
51
|
+
/*#__PURE__*/ _jsx("h1", {
|
|
52
|
+
children: "Translations"
|
|
53
|
+
}),
|
|
54
|
+
/*#__PURE__*/ _jsx("p", {
|
|
55
|
+
children: "Create or connect separate localized documents."
|
|
56
|
+
})
|
|
57
|
+
]
|
|
58
|
+
})
|
|
59
|
+
}),
|
|
60
|
+
/*#__PURE__*/ _jsxs("div", {
|
|
61
|
+
className: "payload-multilang-layout",
|
|
62
|
+
children: [
|
|
63
|
+
/*#__PURE__*/ _jsxs("section", {
|
|
64
|
+
className: "payload-multilang-panel payload-multilang-panel--wide",
|
|
65
|
+
children: [
|
|
66
|
+
/*#__PURE__*/ _jsx("h2", {
|
|
67
|
+
children: "Linked documents"
|
|
68
|
+
}),
|
|
69
|
+
/*#__PURE__*/ _jsxs("table", {
|
|
70
|
+
className: "payload-multilang-table",
|
|
71
|
+
children: [
|
|
72
|
+
/*#__PURE__*/ _jsx("thead", {
|
|
73
|
+
children: /*#__PURE__*/ _jsxs("tr", {
|
|
74
|
+
children: [
|
|
75
|
+
/*#__PURE__*/ _jsx("th", {
|
|
76
|
+
children: "Language"
|
|
77
|
+
}),
|
|
78
|
+
/*#__PURE__*/ _jsx("th", {
|
|
79
|
+
children: "Document ID"
|
|
80
|
+
})
|
|
81
|
+
]
|
|
82
|
+
})
|
|
83
|
+
}),
|
|
84
|
+
/*#__PURE__*/ _jsx("tbody", {
|
|
85
|
+
children: languages.map((language)=>{
|
|
86
|
+
const translation = state.translations[language.code];
|
|
87
|
+
return /*#__PURE__*/ _jsxs("tr", {
|
|
88
|
+
children: [
|
|
89
|
+
/*#__PURE__*/ _jsxs("td", {
|
|
90
|
+
children: [
|
|
91
|
+
language.flagLabel ? `${language.flagLabel} ` : '',
|
|
92
|
+
language.name
|
|
93
|
+
]
|
|
94
|
+
}),
|
|
95
|
+
/*#__PURE__*/ _jsx("td", {
|
|
96
|
+
children: translation?.id ? String(translation.id) : 'Missing'
|
|
97
|
+
})
|
|
98
|
+
]
|
|
99
|
+
}, language.code);
|
|
100
|
+
})
|
|
101
|
+
})
|
|
102
|
+
]
|
|
103
|
+
})
|
|
104
|
+
]
|
|
105
|
+
}),
|
|
106
|
+
/*#__PURE__*/ _jsx(TranslationActionsClient, {
|
|
107
|
+
collectionSlug: collectionSlug,
|
|
108
|
+
docID: docID,
|
|
109
|
+
languages: languages,
|
|
110
|
+
state: state
|
|
111
|
+
})
|
|
112
|
+
]
|
|
113
|
+
})
|
|
114
|
+
]
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
//# sourceMappingURL=TranslationsTab.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/TranslationsTab.tsx"],"sourcesContent":["import type { DocumentViewServerProps } from 'payload'\n\nimport type { MultilangFieldNames, MultilangLanguage } from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES } from '../constants.js'\nimport {\n asDocument,\n getDocumentTranslationsWithPayload,\n getID,\n} from '../lib/data.js'\nimport { getPayloadMultilangCustom } from './config.js'\nimport { TranslationActionsClient } from './TranslationActionsClient.js'\n\nconst getFieldNames = (\n props: DocumentViewServerProps,\n): MultilangFieldNames => {\n const custom = props.initPageResult.collectionConfig?.admin?.custom as\n | { payloadMultilang?: { fieldNames?: Partial<MultilangFieldNames> } }\n | undefined\n\n return {\n ...DEFAULT_FIELD_NAMES,\n ...(custom?.payloadMultilang?.fieldNames || {}),\n }\n}\n\nconst getLanguages = (props: DocumentViewServerProps): MultilangLanguage[] => {\n const languages = getPayloadMultilangCustom(\n props.initPageResult.collectionConfig?.admin?.custom,\n ).languages\n\n return Array.isArray(languages) ? languages : []\n}\n\nexport const TranslationsTab = async (props: DocumentViewServerProps) => {\n const collectionSlug = props.initPageResult.collectionConfig?.slug\n const translationsSegmentIndex = props.routeSegments.lastIndexOf('translations')\n const routeDocID =\n translationsSegmentIndex > 0 ? props.routeSegments[translationsSegmentIndex - 1] : undefined\n const docID = getID(asDocument(props.doc).id || routeDocID || props.id)\n\n if (!collectionSlug || !docID) {\n return (\n <section className=\"payload-multilang-page\">\n <h1>Translations</h1>\n <p>Save the document before managing translations.</p>\n </section>\n )\n }\n\n const fieldNames = getFieldNames(props)\n const languages = getLanguages(props)\n const state = await getDocumentTranslationsWithPayload({\n id: docID,\n collection: collectionSlug,\n fieldNames,\n payload: props.payload,\n })\n\n return (\n <div className=\"payload-multilang-page\" data-testid=\"multilang-translations-tab\">\n <header className=\"payload-multilang-page__header\">\n <div>\n <h1>Translations</h1>\n <p>Create or connect separate localized documents.</p>\n </div>\n </header>\n\n <div className=\"payload-multilang-layout\">\n <section className=\"payload-multilang-panel payload-multilang-panel--wide\">\n <h2>Linked documents</h2>\n <table className=\"payload-multilang-table\">\n <thead>\n <tr>\n <th>Language</th>\n <th>Document ID</th>\n </tr>\n </thead>\n <tbody>\n {languages.map((language) => {\n const translation = state.translations[language.code]\n return (\n <tr key={language.code}>\n <td>\n {language.flagLabel ? `${language.flagLabel} ` : ''}\n {language.name}\n </td>\n <td>{translation?.id ? String(translation.id) : 'Missing'}</td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </section>\n\n <TranslationActionsClient\n collectionSlug={collectionSlug}\n docID={docID}\n languages={languages}\n state={state}\n />\n </div>\n </div>\n )\n}\n"],"names":["DEFAULT_FIELD_NAMES","asDocument","getDocumentTranslationsWithPayload","getID","getPayloadMultilangCustom","TranslationActionsClient","getFieldNames","props","custom","initPageResult","collectionConfig","admin","payloadMultilang","fieldNames","getLanguages","languages","Array","isArray","TranslationsTab","collectionSlug","slug","translationsSegmentIndex","routeSegments","lastIndexOf","routeDocID","undefined","docID","doc","id","section","className","h1","p","state","collection","payload","div","data-testid","header","h2","table","thead","tr","th","tbody","map","language","translation","translations","code","td","flagLabel","name","String"],"mappings":";AAIA,SAASA,mBAAmB,QAAQ,kBAAiB;AACrD,SACEC,UAAU,EACVC,kCAAkC,EAClCC,KAAK,QACA,iBAAgB;AACvB,SAASC,yBAAyB,QAAQ,cAAa;AACvD,SAASC,wBAAwB,QAAQ,gCAA+B;AAExE,MAAMC,gBAAgB,CACpBC;IAEA,MAAMC,SAASD,MAAME,cAAc,CAACC,gBAAgB,EAAEC,OAAOH;IAI7D,OAAO;QACL,GAAGR,mBAAmB;QACtB,GAAIQ,QAAQI,kBAAkBC,cAAc,CAAC,CAAC;IAChD;AACF;AAEA,MAAMC,eAAe,CAACP;IACpB,MAAMQ,YAAYX,0BAChBG,MAAME,cAAc,CAACC,gBAAgB,EAAEC,OAAOH,QAC9CO,SAAS;IAEX,OAAOC,MAAMC,OAAO,CAACF,aAAaA,YAAY,EAAE;AAClD;AAEA,OAAO,MAAMG,kBAAkB,OAAOX;IACpC,MAAMY,iBAAiBZ,MAAME,cAAc,CAACC,gBAAgB,EAAEU;IAC9D,MAAMC,2BAA2Bd,MAAMe,aAAa,CAACC,WAAW,CAAC;IACjE,MAAMC,aACJH,2BAA2B,IAAId,MAAMe,aAAa,CAACD,2BAA2B,EAAE,GAAGI;IACrF,MAAMC,QAAQvB,MAAMF,WAAWM,MAAMoB,GAAG,EAAEC,EAAE,IAAIJ,cAAcjB,MAAMqB,EAAE;IAEtE,IAAI,CAACT,kBAAkB,CAACO,OAAO;QAC7B,qBACE,MAACG;YAAQC,WAAU;;8BACjB,KAACC;8BAAG;;8BACJ,KAACC;8BAAE;;;;IAGT;IAEA,MAAMnB,aAAaP,cAAcC;IACjC,MAAMQ,YAAYD,aAAaP;IAC/B,MAAM0B,QAAQ,MAAM/B,mCAAmC;QACrD0B,IAAIF;QACJQ,YAAYf;QACZN;QACAsB,SAAS5B,MAAM4B,OAAO;IACxB;IAEA,qBACE,MAACC;QAAIN,WAAU;QAAyBO,eAAY;;0BAClD,KAACC;gBAAOR,WAAU;0BAChB,cAAA,MAACM;;sCACC,KAACL;sCAAG;;sCACJ,KAACC;sCAAE;;;;;0BAIP,MAACI;gBAAIN,WAAU;;kCACb,MAACD;wBAAQC,WAAU;;0CACjB,KAACS;0CAAG;;0CACJ,MAACC;gCAAMV,WAAU;;kDACf,KAACW;kDACC,cAAA,MAACC;;8DACC,KAACC;8DAAG;;8DACJ,KAACA;8DAAG;;;;;kDAGR,KAACC;kDACE7B,UAAU8B,GAAG,CAAC,CAACC;4CACd,MAAMC,cAAcd,MAAMe,YAAY,CAACF,SAASG,IAAI,CAAC;4CACrD,qBACE,MAACP;;kEACC,MAACQ;;4DACEJ,SAASK,SAAS,GAAG,GAAGL,SAASK,SAAS,CAAC,CAAC,CAAC,GAAG;4DAChDL,SAASM,IAAI;;;kEAEhB,KAACF;kEAAIH,aAAanB,KAAKyB,OAAON,YAAYnB,EAAE,IAAI;;;+CALzCkB,SAASG,IAAI;wCAQ1B;;;;;;kCAKN,KAAC5C;wBACCc,gBAAgBA;wBAChBO,OAAOA;wBACPX,WAAWA;wBACXkB,OAAOA;;;;;;AAKjB,EAAC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { MultilangFieldNames, MultilangLanguage } from '../types.js';
|
|
2
|
+
type ConfigLike = {
|
|
3
|
+
admin?: {
|
|
4
|
+
custom?: unknown;
|
|
5
|
+
};
|
|
6
|
+
collections?: {
|
|
7
|
+
admin?: {
|
|
8
|
+
custom?: unknown;
|
|
9
|
+
};
|
|
10
|
+
slug: string;
|
|
11
|
+
}[];
|
|
12
|
+
globals?: {
|
|
13
|
+
admin?: {
|
|
14
|
+
custom?: unknown;
|
|
15
|
+
};
|
|
16
|
+
slug: string;
|
|
17
|
+
}[];
|
|
18
|
+
};
|
|
19
|
+
type PayloadMultilangCustom = {
|
|
20
|
+
defaultLanguage?: MultilangLanguage;
|
|
21
|
+
fieldNames?: Partial<MultilangFieldNames>;
|
|
22
|
+
languageCode?: string;
|
|
23
|
+
languages?: MultilangLanguage[];
|
|
24
|
+
};
|
|
25
|
+
export declare const getPayloadMultilangCustom: (custom: unknown) => PayloadMultilangCustom;
|
|
26
|
+
export declare const getConfiguredLanguagesFromConfig: (config: ConfigLike) => MultilangLanguage[];
|
|
27
|
+
export declare const getDefaultLanguageFromConfig: (config: ConfigLike) => MultilangLanguage | undefined;
|
|
28
|
+
export declare const getCollectionMultilangCustom: ({ collectionSlug, config, }: {
|
|
29
|
+
collectionSlug?: string;
|
|
30
|
+
config: ConfigLike;
|
|
31
|
+
}) => PayloadMultilangCustom;
|
|
32
|
+
export declare const getCollectionFieldNames: ({ collectionSlug, config, }: {
|
|
33
|
+
collectionSlug?: string;
|
|
34
|
+
config: ConfigLike;
|
|
35
|
+
}) => MultilangFieldNames;
|
|
36
|
+
export declare const getGlobalMultilangCustom: ({ config, globalSlug, }: {
|
|
37
|
+
config: ConfigLike;
|
|
38
|
+
globalSlug?: string;
|
|
39
|
+
}) => PayloadMultilangCustom;
|
|
40
|
+
export {};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { DEFAULT_FIELD_NAMES } from '../constants.js';
|
|
2
|
+
const asRecord = (value)=>value && typeof value === 'object' ? value : {};
|
|
3
|
+
export const getPayloadMultilangCustom = (custom)=>{
|
|
4
|
+
const payloadMultilang = asRecord(asRecord(custom).payloadMultilang);
|
|
5
|
+
return payloadMultilang;
|
|
6
|
+
};
|
|
7
|
+
export const getConfiguredLanguagesFromConfig = (config)=>{
|
|
8
|
+
const custom = getPayloadMultilangCustom(config.admin?.custom);
|
|
9
|
+
return Array.isArray(custom.languages) ? custom.languages : [];
|
|
10
|
+
};
|
|
11
|
+
export const getDefaultLanguageFromConfig = (config)=>{
|
|
12
|
+
const custom = getPayloadMultilangCustom(config.admin?.custom);
|
|
13
|
+
return custom.defaultLanguage || getConfiguredLanguagesFromConfig(config)[0];
|
|
14
|
+
};
|
|
15
|
+
export const getCollectionMultilangCustom = ({ collectionSlug, config })=>{
|
|
16
|
+
const collection = config.collections?.find((item)=>item.slug === collectionSlug);
|
|
17
|
+
return getPayloadMultilangCustom(collection?.admin?.custom);
|
|
18
|
+
};
|
|
19
|
+
export const getCollectionFieldNames = ({ collectionSlug, config })=>({
|
|
20
|
+
...DEFAULT_FIELD_NAMES,
|
|
21
|
+
...getCollectionMultilangCustom({
|
|
22
|
+
collectionSlug,
|
|
23
|
+
config
|
|
24
|
+
}).fieldNames || {}
|
|
25
|
+
});
|
|
26
|
+
export const getGlobalMultilangCustom = ({ config, globalSlug })=>{
|
|
27
|
+
const global = config.globals?.find((item)=>item.slug === globalSlug);
|
|
28
|
+
return getPayloadMultilangCustom(global?.admin?.custom);
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/components/config.ts"],"sourcesContent":["import type { MultilangFieldNames, MultilangLanguage } from '../types.js'\n\nimport { DEFAULT_FIELD_NAMES } from '../constants.js'\n\ntype ConfigLike = {\n admin?: {\n custom?: unknown\n }\n collections?: {\n admin?: {\n custom?: unknown\n }\n slug: string\n }[]\n globals?: {\n admin?: {\n custom?: unknown\n }\n slug: string\n }[]\n}\n\ntype PayloadMultilangCustom = {\n defaultLanguage?: MultilangLanguage\n fieldNames?: Partial<MultilangFieldNames>\n languageCode?: string\n languages?: MultilangLanguage[]\n}\n\nconst asRecord = (value: unknown): Record<string, unknown> =>\n value && typeof value === 'object' ? (value as Record<string, unknown>) : {}\n\nexport const getPayloadMultilangCustom = (\n custom: unknown,\n): PayloadMultilangCustom => {\n const payloadMultilang = asRecord(asRecord(custom).payloadMultilang)\n\n return payloadMultilang as PayloadMultilangCustom\n}\n\nexport const getConfiguredLanguagesFromConfig = (\n config: ConfigLike,\n): MultilangLanguage[] => {\n const custom = getPayloadMultilangCustom(config.admin?.custom)\n\n return Array.isArray(custom.languages) ? custom.languages : []\n}\n\nexport const getDefaultLanguageFromConfig = (\n config: ConfigLike,\n): MultilangLanguage | undefined => {\n const custom = getPayloadMultilangCustom(config.admin?.custom)\n\n return custom.defaultLanguage || getConfiguredLanguagesFromConfig(config)[0]\n}\n\nexport const getCollectionMultilangCustom = ({\n collectionSlug,\n config,\n}: {\n collectionSlug?: string\n config: ConfigLike\n}): PayloadMultilangCustom => {\n const collection = config.collections?.find((item) => item.slug === collectionSlug)\n\n return getPayloadMultilangCustom(collection?.admin?.custom)\n}\n\nexport const getCollectionFieldNames = ({\n collectionSlug,\n config,\n}: {\n collectionSlug?: string\n config: ConfigLike\n}): MultilangFieldNames => ({\n ...DEFAULT_FIELD_NAMES,\n ...(getCollectionMultilangCustom({ collectionSlug, config }).fieldNames || {}),\n})\n\nexport const getGlobalMultilangCustom = ({\n config,\n globalSlug,\n}: {\n config: ConfigLike\n globalSlug?: string\n}): PayloadMultilangCustom => {\n const global = config.globals?.find((item) => item.slug === globalSlug)\n\n return getPayloadMultilangCustom(global?.admin?.custom)\n}\n"],"names":["DEFAULT_FIELD_NAMES","asRecord","value","getPayloadMultilangCustom","custom","payloadMultilang","getConfiguredLanguagesFromConfig","config","admin","Array","isArray","languages","getDefaultLanguageFromConfig","defaultLanguage","getCollectionMultilangCustom","collectionSlug","collection","collections","find","item","slug","getCollectionFieldNames","fieldNames","getGlobalMultilangCustom","globalSlug","global","globals"],"mappings":"AAEA,SAASA,mBAAmB,QAAQ,kBAAiB;AA2BrD,MAAMC,WAAW,CAACC,QAChBA,SAAS,OAAOA,UAAU,WAAYA,QAAoC,CAAC;AAE7E,OAAO,MAAMC,4BAA4B,CACvCC;IAEA,MAAMC,mBAAmBJ,SAASA,SAASG,QAAQC,gBAAgB;IAEnE,OAAOA;AACT,EAAC;AAED,OAAO,MAAMC,mCAAmC,CAC9CC;IAEA,MAAMH,SAASD,0BAA0BI,OAAOC,KAAK,EAAEJ;IAEvD,OAAOK,MAAMC,OAAO,CAACN,OAAOO,SAAS,IAAIP,OAAOO,SAAS,GAAG,EAAE;AAChE,EAAC;AAED,OAAO,MAAMC,+BAA+B,CAC1CL;IAEA,MAAMH,SAASD,0BAA0BI,OAAOC,KAAK,EAAEJ;IAEvD,OAAOA,OAAOS,eAAe,IAAIP,iCAAiCC,OAAO,CAAC,EAAE;AAC9E,EAAC;AAED,OAAO,MAAMO,+BAA+B,CAAC,EAC3CC,cAAc,EACdR,MAAM,EAIP;IACC,MAAMS,aAAaT,OAAOU,WAAW,EAAEC,KAAK,CAACC,OAASA,KAAKC,IAAI,KAAKL;IAEpE,OAAOZ,0BAA0Ba,YAAYR,OAAOJ;AACtD,EAAC;AAED,OAAO,MAAMiB,0BAA0B,CAAC,EACtCN,cAAc,EACdR,MAAM,EAIP,GAA2B,CAAA;QAC1B,GAAGP,mBAAmB;QACtB,GAAIc,6BAA6B;YAAEC;YAAgBR;QAAO,GAAGe,UAAU,IAAI,CAAC,CAAC;IAC/E,CAAA,EAAE;AAEF,OAAO,MAAMC,2BAA2B,CAAC,EACvChB,MAAM,EACNiB,UAAU,EAIX;IACC,MAAMC,SAASlB,OAAOmB,OAAO,EAAER,KAAK,CAACC,OAASA,KAAKC,IAAI,KAAKI;IAE5D,OAAOrB,0BAA0BsB,QAAQjB,OAAOJ;AAClD,EAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { MultilangFieldNames } from './types.js';
|
|
2
|
+
export declare const DEFAULT_FIELD_NAMES: MultilangFieldNames;
|
|
3
|
+
export declare const DEFAULT_GLOBAL_TABS_LABEL = "Localized content";
|
|
4
|
+
export declare const DEFAULT_DUPLICATE_EXCLUDE_FIELDS: string[];
|
|
5
|
+
export declare const MULTILANG_SKIP_HOOK = "payloadMultilangSkip";
|