Skip to content

Commit 1d6ffcb

Browse files
feat(ui): adds support for copy pasting complex fields (#11513)
<!-- Thank you for the PR! Please go through the checklist below and make sure you've completed all the steps. Please review the [CONTRIBUTING.md](https://github.com/payloadcms/payload/blob/main/CONTRIBUTING.md) document in this repository if you haven't already. The following items will ensure that your PR is handled as smoothly as possible: - PR Title must follow conventional commits format. For example, `feat: my new feature`, `fix(plugin-seo): my fix`. - Minimal description explained as if explained to someone not immediately familiar with the code. - Provide before/after screenshots or code diffs if applicable. - Link any related issues/discussions from GitHub or Discord. - Add review comments if necessary to explain to the reviewer the logic behind a change ### What? ### Why? ### How? Fixes # --> ### What? This PR introduces support for copy + pasting complex fields such as Arrays and Blocks. These changes introduce a new `ClipboardAction` component that houses logic for copy + pasting to and from the clipboard to supported fields. I've scoped this PR to include only Blocks & Arrays, however the structure of the components introduced lend themselves to be easily extended to other field types. I've limited the scope because there may be design & functional blockers that make it unclear how to add actions to particular fields. Supported fields: - Arrays ([Demo](https://github.com/user-attachments/assets/523916f6-77d0-43e2-9a11-a6a9d8c1b71c)) - Array Rows ([Demo](https://github.com/user-attachments/assets/0cd01a1f-3e5e-4fea-ac83-8c0bba8d1aac)) - Blocks ([Demo](https://github.com/user-attachments/assets/4c55ac2b-55f4-4793-9b53-309b2e090dd9)) - Block Rows ([Demo](https://github.com/user-attachments/assets/1b4d2bea-981a-485b-a6c4-c59a77a50567)) Fields that may be supported in the future with minimal effort by adopting the changes introduced here: - Tabs - Groups - Collapsible - Relationships This PR also encompasses e2e tests that check both field and row-level copy/pasting. ### Why? To make it simpler and faster to copy complex fields over between documents and rows within those docs. ### How? Introduces a new `ClipboardAction` component with helper utilities to aid in copy/pasting and validating field data. Addresses #2977 & #10703 Notes: - There seems to be an issue with Blocks & Arrays that contain RichText fields where the RichText field dissappears from the dom upon replacing form state. These fields are resurfaced after either saving the data or dragging/dropping the row containing them. - Copying a Row and then pasting it at the field-level will overwrite the field to include only that one row. This is intended however can be changed if requested. - Clipboard permissions are required to use this feature. [See Clipboard API caniuse](https://caniuse.com/async-clipboard). #### TODO - [x] ~~I forgot BlockReferences~~ - [x] ~~Fix tests failing due to new buttons causing locator conflicts~~ - [x] ~~Ensure deeply nested structures work~~ - [x] ~~Add missing translations~~ - [x] ~~Implement local storage instead of clipboard api~~ - [x] ~~Improve tests~~ --------- Co-authored-by: Germán Jabloñski <43938777+GermanJablo@users.noreply.github.com>
1 parent dde9681 commit 1d6ffcb

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1699
-56
lines changed

packages/translations/src/clientKeys.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,15 @@ export const clientTranslationKeys = createClientTranslationKeys([
6868
'error:emailOrPasswordIncorrect',
6969
'error:usernameOrPasswordIncorrect',
7070
'error:loadingDocument',
71+
'error:insufficientClipboardPermissions',
72+
'error:invalidClipboardData',
7173
'error:invalidRequestArgs',
7274
'error:invalidFileType',
7375
'error:logoutFailed',
7476
'error:noMatchedField',
7577
'error:notAllowedToAccessPage',
7678
'error:previewing',
79+
'error:unableToCopy',
7780
'error:unableToDeleteCount',
7881
'error:unableToReindexCollection',
7982
'error:unableToUpdateCount',
@@ -182,6 +185,8 @@ export const clientTranslationKeys = createClientTranslationKeys([
182185
'general:copied',
183186
'general:clearAll',
184187
'general:copy',
188+
'general:copyField',
189+
'general:copyRow',
185190
'general:copyWarning',
186191
'general:copying',
187192
'general:create',
@@ -267,6 +272,8 @@ export const clientTranslationKeys = createClientTranslationKeys([
267272
'general:overwriteExistingData',
268273
'general:pageNotFound',
269274
'general:password',
275+
'general:pasteField',
276+
'general:pasteRow',
270277
'general:payloadSettings',
271278
'general:perPage',
272279
'general:previous',

packages/translations/src/languages/ar.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,8 @@ export const arTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'الحقل التالي غير صالح:',
9191
followingFieldsInvalid_other: 'الحقول التالية غير صالحة:',
9292
incorrectCollection: 'مجموعة غير صحيحة',
93+
insufficientClipboardPermissions: 'تم رفض الوصول إلى الحافظة. يرجى التحقق من أذونات الحافظة.',
94+
invalidClipboardData: 'بيانات الحافظة غير صالحة.',
9395
invalidFileType: 'نوع ملف غير صالح',
9496
invalidFileTypeValue: 'نوع ملف غير صالح: {{value}}',
9597
invalidRequestArgs: 'تم تمرير وسيطات غير صالحة في الطلب: {{args}}',
@@ -111,6 +113,7 @@ export const arTranslations: DefaultTranslationsObject = {
111113
problemUploadingFile: 'حدث خطأ اثناء رفع الملفّ.',
112114
tokenInvalidOrExpired: 'الرّمز إمّا غير صالح أو منتهي الصّلاحيّة.',
113115
tokenNotProvided: 'لم يتم تقديم الرمز.',
116+
unableToCopy: 'تعذر النسخ.',
114117
unableToDeleteCount: 'يتعذّر حذف {{count}} من {{total}} {{label}}.',
115118
unableToReindexCollection: 'خطأ في إعادة فهرسة المجموعة {{collection}}. تم إيقاف العملية.',
116119
unableToUpdateCount: 'يتعذّر تحديث {{count}} من {{total}} {{label}}.',
@@ -237,7 +240,9 @@ export const arTranslations: DefaultTranslationsObject = {
237240
'سيؤدي هذا إلى إزالة الفهارس الحالية وإعادة فهرسة المستندات في جميع المجموعات.',
238241
copied: 'تمّ النّسخ',
239242
copy: 'نسخ',
243+
copyField: 'نسخ الحقل',
240244
copying: 'نسخ',
245+
copyRow: 'نسخ الصف',
241246
copyWarning: 'أنت على وشك الكتابة فوق {{to}} بـ {{from}} لـ {{label}} {{title}}. هل أنت متأكد؟',
242247
create: 'إنشاء',
243248
created: 'تمّ الإنشاء',
@@ -330,6 +335,8 @@ export const arTranslations: DefaultTranslationsObject = {
330335
overwriteExistingData: 'استبدل بيانات الحقل الموجودة',
331336
pageNotFound: 'الصّفحة غير موجودة',
332337
password: 'كلمة المرور',
338+
pasteField: 'لصق الحقل',
339+
pasteRow: 'لصق الصف',
333340
payloadSettings: 'الإعدادات',
334341
perPage: 'لكلّ صفحة: {{limit}}',
335342
previous: 'سابق',

packages/translations/src/languages/az.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export const azTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'Aşağıdakı sahə yanlışdır:',
9191
followingFieldsInvalid_other: 'Aşağıdaki sahələr yanlışdır:',
9292
incorrectCollection: 'Yanlış Kolleksiya',
93+
insufficientClipboardPermissions:
94+
'Mübadilə buferinə giriş rədd edildi. Zəhmət olmasa, icazələri yoxlayın.',
95+
invalidClipboardData: 'Yanlış mübadilə buferi məlumatı.',
9396
invalidFileType: 'Yanlış fayl növü',
9497
invalidFileTypeValue: 'Yanlış fayl növü: {{value}}',
9598
invalidRequestArgs: 'Sorguda etibarsız arqumentlər təqdim edildi: {{args}}',
@@ -111,6 +114,7 @@ export const azTranslations: DefaultTranslationsObject = {
111114
problemUploadingFile: 'Faylın yüklənməsi zamanı problem yarandı.',
112115
tokenInvalidOrExpired: 'Token ya yanlışdır və ya müddəti bitib.',
113116
tokenNotProvided: 'Token təqdim edilməyib.',
117+
unableToCopy: 'Kopyalama mümkün deyil.',
114118
unableToDeleteCount: '{{count}} dən {{total}} {{label}} silinə bilmir.',
115119
unableToReindexCollection:
116120
'{{collection}} kolleksiyasının yenidən indekslənməsi zamanı səhv baş verdi. Əməliyyat dayandırıldı.',
@@ -241,7 +245,9 @@ export const azTranslations: DefaultTranslationsObject = {
241245
'Bu, mövcud indeksləri siləcək və bütün kolleksiyalardakı sənədləri yenidən indeksləyəcək.',
242246
copied: 'Kopyalandı',
243247
copy: 'Kopyala',
248+
copyField: 'Sahəni kopyala',
244249
copying: 'Kopyalama',
250+
copyRow: 'Sətiri kopyala',
245251
copyWarning:
246252
'Siz {{label}} {{title}} üçün {{from}} ilə {{to}} -nu üzərindən yazmaq ətrafındasınız. Eminsiniz?',
247253
create: 'Yarat',
@@ -336,6 +342,8 @@ export const azTranslations: DefaultTranslationsObject = {
336342
overwriteExistingData: 'Mövcud sahə məlumatlarını yenidən yazın',
337343
pageNotFound: 'Səhifə tapılmadı',
338344
password: 'Şifrə',
345+
pasteField: 'Sahəni yapışdır',
346+
pasteRow: 'Sətiri yapışdır',
339347
payloadSettings: 'Payload Parametrləri',
340348
perPage: 'Hər səhifədə: {{limit}}',
341349
previous: 'Əvvəlki',

packages/translations/src/languages/bg.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export const bgTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'Следното поле е некоректно:',
9191
followingFieldsInvalid_other: 'Следните полета са некоректни:',
9292
incorrectCollection: 'Грешна колекция',
93+
insufficientClipboardPermissions:
94+
'Достъпът до клипборда е отказан. Моля, проверете вашите разрешения за клипборда.',
95+
invalidClipboardData: 'Невалидни данни в клипборда.',
9396
invalidFileType: 'Невалиден тип на файл',
9497
invalidFileTypeValue: 'Невалиден тип на файл: {{value}}',
9598
invalidRequestArgs: 'Невалидни аргументи в заявката: {{args}}',
@@ -111,6 +114,7 @@ export const bgTranslations: DefaultTranslationsObject = {
111114
problemUploadingFile: 'Имаше проблем при качването на файла.',
112115
tokenInvalidOrExpired: 'Ключът е невалиден или изтекъл.',
113116
tokenNotProvided: 'Токенът не е предоставен.',
117+
unableToCopy: 'Неуспешно копиране.',
114118
unableToDeleteCount: 'Не беше възможно да се изтрият {{count}} от {{total}} {{label}}.',
115119
unableToReindexCollection:
116120
'Грешка при преиндексиране на колекцията {{collection}}. Операцията е прекратена.',
@@ -240,7 +244,9 @@ export const bgTranslations: DefaultTranslationsObject = {
240244
'Това ще премахне съществуващите индекси и ще преиндексира документите във всички колекции.',
241245
copied: 'Копирано',
242246
copy: 'Копирай',
247+
copyField: 'Копирай поле',
243248
copying: 'Копиране',
249+
copyRow: 'Копирай ред',
244250
copyWarning:
245251
'Предстои да презапишете {{to}} с {{from}} за {{label}} {{title}}. Сигурни ли сте?',
246252
create: 'Създай',
@@ -335,6 +341,8 @@ export const bgTranslations: DefaultTranslationsObject = {
335341
overwriteExistingData: 'Презапишете съществуващите данни в полето',
336342
pageNotFound: 'Страницата не беше открита',
337343
password: 'Парола',
344+
pasteField: 'Постави поле',
345+
pasteRow: 'Постави ред',
338346
payloadSettings: 'Настройки на Payload',
339347
perPage: 'На страница: {{limit}}',
340348
previous: 'Предишен',

packages/translations/src/languages/bnBd.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export const bnBdTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'নিম্নলিখিত ক্ষেত্রটি অবৈধ:',
9191
followingFieldsInvalid_other: 'নিম্নলিখিত ক্ষেত্রগুলি অবৈধ:',
9292
incorrectCollection: 'ভুল সংগ্রহ',
93+
insufficientClipboardPermissions:
94+
'ক্লিপবোর্ড অ্যাক্সেস প্রত্যাখ্যান করা হয়েছে। দয়া করে আপনার ক্লিপবোর্ড অনুমতিগুলি পরীক্ষা করুন।',
95+
invalidClipboardData: 'অবৈধ ক্লিপবোর্ড ডেটা।',
9396
invalidFileType: 'অবৈধ ফাইল প্রকার',
9497
invalidFileTypeValue: 'অবৈধ ফাইল প্রকার: {{value}}',
9598
invalidRequestArgs: 'অনুরোধে অবৈধ আর্গুমেন্ট পাস করা হয়েছে: {{args}}',
@@ -111,6 +114,7 @@ export const bnBdTranslations: DefaultTranslationsObject = {
111114
problemUploadingFile: 'ফাইল আপলোড করতে একটি সমস্যা হয়েছে।',
112115
tokenInvalidOrExpired: 'টোকেন অবৈধ বা মেয়াদ শেষ হয়ে গেছে।',
113116
tokenNotProvided: 'টোকেন প্রদান করা হয়নি।',
117+
unableToCopy: 'কপি করা সম্ভব নয়।',
114118
unableToDeleteCount: '{{total}} {{label}} এর মধ্যে {{count}} টি মুছতে অক্ষম।',
115119
unableToReindexCollection:
116120
'{{collection}} সংগ্রহ পুনরায় সূচিবদ্ধ করতে ত্রুটি হয়েছে। অপারেশন বাতিল করা হয়েছে।',
@@ -242,7 +246,9 @@ export const bnBdTranslations: DefaultTranslationsObject = {
242246
'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং সমস্ত সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।',
243247
copied: 'কপি করা হয়েছে',
244248
copy: 'কপি করুন',
249+
copyField: 'ফিল্ড কপি করুন',
245250
copying: 'কপি করা হচ্ছে',
251+
copyRow: 'সারি কপি করুন',
246252
copyWarning:
247253
'আপনি {{label}} {{title}} এর জন্য {{to}} কে {{from}} দ্বারা ওভাররাইট করতে চলেছেন। আপনি কি নিশ্চিত?',
248254
create: 'তৈরি করুন',
@@ -337,6 +343,8 @@ export const bnBdTranslations: DefaultTranslationsObject = {
337343
overwriteExistingData: 'বিদ্যমান ফিল্ড ডেটা ওভাররাইট করুন',
338344
pageNotFound: 'পৃষ্ঠা পাওয়া যায়নি',
339345
password: 'পাসওয়ার্ড',
346+
pasteField: 'ফিল্ড পেস্ট করুন',
347+
pasteRow: 'সারি পেস্ট করুন',
340348
payloadSettings: 'পেলোড সেটিংস',
341349
perPage: 'প্রতি পৃষ্ঠায়: {{limit}}',
342350
previous: 'পূর্ববর্তী',

packages/translations/src/languages/bnIn.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export const bnInTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'নিম্নলিখিত ক্ষেত্রটি অবৈধ:',
9191
followingFieldsInvalid_other: 'নিম্নলিখিত ক্ষেত্রগুলি অবৈধ:',
9292
incorrectCollection: 'ভুল সংগ্রহ',
93+
insufficientClipboardPermissions:
94+
'ক্লিপবোর্ড অ্যাক্সেস অস্বীকৃত হয়েছে। অনুগ্রহ করে আপনার ক্লিপবোর্ড অনুমতিগুলি পরীক্ষা করুন।',
95+
invalidClipboardData: 'অবৈধ ক্লিপবোর্ড ডেটা।',
9396
invalidFileType: 'অবৈধ ফাইল প্রকার',
9497
invalidFileTypeValue: 'অবৈধ ফাইল প্রকার: {{value}}',
9598
invalidRequestArgs: 'অনুরোধে অবৈধ আর্গুমেন্ট পাস করা হয়েছে: {{args}}',
@@ -111,6 +114,7 @@ export const bnInTranslations: DefaultTranslationsObject = {
111114
problemUploadingFile: 'ফাইল আপলোড করতে একটি সমস্যা হয়েছে।',
112115
tokenInvalidOrExpired: 'টোকেন অবৈধ বা মেয়াদ শেষ হয়ে গেছে।',
113116
tokenNotProvided: 'টোকেন প্রদান করা হয়নি।',
117+
unableToCopy: 'কপি করতে অক্ষম।',
114118
unableToDeleteCount: '{{total}} {{label}} এর মধ্যে {{count}} টি মুছতে অক্ষম।',
115119
unableToReindexCollection:
116120
'{{collection}} সংগ্রহ পুনরায় সূচিবদ্ধ করতে ত্রুটি হয়েছে। অপারেশন বাতিল করা হয়েছে।',
@@ -242,7 +246,9 @@ export const bnInTranslations: DefaultTranslationsObject = {
242246
'এটি বিদ্যমান সূচিগুলি সরিয়ে দেবে এবং সমস্ত সংগ্রহগুলির ডকুমেন্টগুলি পুনরায় সূচিবদ্ধ করবে।',
243247
copied: 'কপি করা হয়েছে',
244248
copy: 'কপি করুন',
249+
copyField: 'ফিল্ড কপি করুন',
245250
copying: 'কপি করা হচ্ছে',
251+
copyRow: 'সারি কপি করুন',
246252
copyWarning:
247253
'আপনি {{label}} {{title}} এর জন্য {{to}} কে {{from}} দ্বারা ওভাররাইট করতে চলেছেন। আপনি কি নিশ্চিত?',
248254
create: 'তৈরি করুন',
@@ -337,6 +343,8 @@ export const bnInTranslations: DefaultTranslationsObject = {
337343
overwriteExistingData: 'বিদ্যমান ফিল্ড ডেটা ওভাররাইট করুন',
338344
pageNotFound: 'পৃষ্ঠা পাওয়া যায়নি',
339345
password: 'পাসওয়ার্ড',
346+
pasteField: 'ফিল্ড পেস্ট করুন',
347+
pasteRow: 'সারি পেস্ট করুন',
340348
payloadSettings: 'পেলোড সেটিংস',
341349
perPage: 'প্রতি পৃষ্ঠায়: {{limit}}',
342350
previous: 'পূর্ববর্তী',

packages/translations/src/languages/ca.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ export const caTranslations: DefaultTranslationsObject = {
9191
followingFieldsInvalid_one: 'El següent camp no és vàlid:',
9292
followingFieldsInvalid_other: 'Els següents camps no són vàlids:',
9393
incorrectCollection: 'Col·lecció incorrecta',
94+
insufficientClipboardPermissions:
95+
'Accés al porta-retalls denegat. Comproveu els permisos del porta-retalls.',
96+
invalidClipboardData: 'Dades del porta-retalls no vàlides.',
9497
invalidFileType: "Tipus d'arxiu no vàlid",
9598
invalidFileTypeValue: "Tipus d'arxiu no vàlid: {{value}}",
9699
invalidRequestArgs: 'Arguments no vàlids en la sol·licitud: {{args}}',
@@ -112,6 +115,7 @@ export const caTranslations: DefaultTranslationsObject = {
112115
problemUploadingFile: "Hi ha hagut un problema mentre es carregava l'arxiu.",
113116
tokenInvalidOrExpired: 'El token és invàlid o ha caducat.',
114117
tokenNotProvided: "No s'ha proporcionat cap token.",
118+
unableToCopy: 'No es pot copiar.',
115119
unableToDeleteCount: "No s'han pogut eliminar {{count}} de {{total}} {{label}}.",
116120
unableToReindexCollection:
117121
'Error al reindexar la col·lecció {{collection}}. Operació cancel·lada.',
@@ -241,7 +245,9 @@ export const caTranslations: DefaultTranslationsObject = {
241245
'Aixo eliminarà els índexs existents i reindexarà els documents de totes les col·leccions.',
242246
copied: 'Copiat',
243247
copy: 'Copiar',
248+
copyField: 'Copiar camp',
244249
copying: 'Copiant',
250+
copyRow: 'Copiar fila',
245251
copyWarning:
246252
'Estas a punt de sobreescriure {{to}} amb {{from}} per {{label}} {{title}}. Estas segur?',
247253
create: 'Crear',
@@ -336,6 +342,8 @@ export const caTranslations: DefaultTranslationsObject = {
336342
overwriteExistingData: 'Sobreescriu les dades existents',
337343
pageNotFound: 'Pàgina no trobada',
338344
password: 'Contrasenya',
345+
pasteField: 'Enganxar camp',
346+
pasteRow: 'Enganxar fila',
339347
payloadSettings: 'configuracio Payload',
340348
perPage: 'Per pagian: {{limit}}',
341349
previous: 'Previ',

packages/translations/src/languages/cs.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ export const csTranslations: DefaultTranslationsObject = {
9090
followingFieldsInvalid_one: 'Následující pole je neplatné:',
9191
followingFieldsInvalid_other: 'Následující pole jsou neplatná:',
9292
incorrectCollection: 'Nesprávná kolekce',
93+
insufficientClipboardPermissions:
94+
'Přístup ke schránce byl odepřen. Zkontrolujte oprávnění ke schránce.',
95+
invalidClipboardData: 'Neplatná data ve schránce.',
9396
invalidFileType: 'Neplatný typ souboru',
9497
invalidFileTypeValue: 'Neplatný typ souboru: {{value}}',
9598
invalidRequestArgs: 'Neplatné argumenty v požadavku: {{args}}',
@@ -111,6 +114,7 @@ export const csTranslations: DefaultTranslationsObject = {
111114
problemUploadingFile: 'Při nahrávání souboru došlo k chybě.',
112115
tokenInvalidOrExpired: 'Token je neplatný nebo vypršel.',
113116
tokenNotProvided: 'Token není poskytnut.',
117+
unableToCopy: 'Nelze zkopírovat.',
114118
unableToDeleteCount: 'Nelze smazat {{count}} z {{total}} {{label}}',
115119
unableToReindexCollection:
116120
'Chyba při přeindexování kolekce {{collection}}. Operace byla přerušena.',
@@ -240,7 +244,9 @@ export const csTranslations: DefaultTranslationsObject = {
240244
'Tímto budou odstraněny stávající indexy a dokumenty ve všech kolekcích budou znovu zaindexovány.',
241245
copied: 'Zkopírováno',
242246
copy: 'Kopírovat',
247+
copyField: 'Kopírovat pole',
243248
copying: 'Kopírování',
249+
copyRow: 'Kopírovat řádek',
244250
copyWarning: 'Chystáte se přepsat {{to}} s {{from}} pro {{label}} {{title}}. Jste si jistý?',
245251
create: 'Vytvořit',
246252
created: 'Vytvořeno',
@@ -334,6 +340,8 @@ export const csTranslations: DefaultTranslationsObject = {
334340
overwriteExistingData: 'Přepsat existující data pole',
335341
pageNotFound: 'Stránka nenalezena',
336342
password: 'Heslo',
343+
pasteField: 'Vložit pole',
344+
pasteRow: 'Vložit řádek',
337345
payloadSettings: 'Payload nastavení',
338346
perPage: 'Na stránku: {{limit}}',
339347
previous: 'Předchozí',

0 commit comments

Comments
 (0)