Add *.pdf preview (#2105)

* Create uk-UA.json

added Ukrainian locale json

* Add files via upload

* fix

* Update uk_UA.ts

* feat(client): add pdf preview

* feat(client): add pdf preview to upload

* fix: refactor pdf preview

---------

Co-authored-by: alexkash <kashmensky@gmail.com>
This commit is contained in:
yaroslav.kr 2023-06-27 11:00:41 +03:00 committed by GitHub
parent e79ea701a3
commit dd3e872b06
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 2151 additions and 24 deletions

View File

@ -0,0 +1,713 @@
export default {
"Display <1><0>10</0><1>20</1><2>50</2><3>100</3></1> items per page": "Відображати <1><0>10</0><1>20</1><2>50</2><3>100</3></1> предметів на сторінку",
"Meet <1><0>All</0><1>Any</1></1> conditions in the group": "Виконувати <1><0>усі</0><1>будь-які</1></1> умови в групі",
"Open in<1><0>Modal</0><1>Drawer</1><2>Window</2></1>": "Відкрити в<1><0>Модалі</0><1>Шухляді</1><2>Вікні</2></1>",
"{{count}} filter items": "{{count}} предметів для фільтрації",
"{{count}} more items": "Ще {{count}} предметів",
"Total {{count}} items": "Всього {{count}} предметів",
"Today": "Сьогодні",
"Yesterday": "Вчора",
"Tomorrow": "Завтра",
"Month": "Місяць",
"Week": "Тиждень",
"This week": "Цей тиждень",
"This month": "Цей місяць",
"This year": "Цей рік",
"Next year": "Наступний рік",
"Last week": "Минулий тиждень",
"Next week": "Наступний тиждень",
"Last month": "Минулий місяць",
"Next month": "Наступний місяць",
"Last quarter": "Минулий квартал",
"This quarter": "Цей квартал",
"Next quarter": "Наступний квартал",
"Last year": "Минулий рік",
"Last 7 days": "Минулі 7 днів",
"Last 30 days": "Минулі 30 днів",
"Last 90 days": "Минулі 90 днів",
"Next 7 days": "Наступні 7 днів",
"Next 30 days": "Наступні 30 днів",
"Next 90 days": "Наступні 90 днів",
"Work week": "Робочий тиждень",
"Day": "День",
"Agenda": "Порядок денний",
"Date": "Дата",
"Time": "Час",
"Event": "Подія",
"None": "Немає",
"Unconnected": "Не з'єднаний",
"System settings": "Системні налаштування",
"System title": "Системний заголовок",
"Logo": "Логотип",
"Add menu item": "Додати елемент меню",
"Page": "Сторінка",
"Name": "Ім'я",
"Icon": "Іконка",
"Group": "Група",
"Link": "Посилання",
"Save conditions": "Зберегти умови",
"Edit menu item": "Редагувати елемент меню",
"Move to": "Перемістити до",
"Insert left": "Вставити зліва",
"Insert right": "Вставити справа",
"Insert inner": "Вставити всередину",
"Delete": "Видалити",
"UI editor": "Редактор UI",
"Collection": "Колекція",
"Collections & Fields": "Колекції та поля",
"All collections": "Всі колекції",
"Add category": "Додати категорію",
"Enable child collections": "Увімкнути дочірні колекції",
"Allow adding records to the current collection": "Дозволити додавання записів до поточної колекції",
"Delete category": "Видалити категорію",
"Edit category": "Редагувати категорію",
"Collection category": "Категорія колекції",
"Collection template": "Шаблон колекції",
"Sort": "Сортувати",
"Categories": "Категорії",
"Visible": "Видимо",
"Read only": "Тільки для читання",
"Easy reading": "Легке читання",
"Hidden": "Приховано",
"Hidden(reserved value)": "Приховано (зарезервоване значення)",
"Not required": "Не обов'язково",
"Value": "Значення",
"Disabled": "Вимкнено",
"Enabled": "Увімкнено",
"On": "Увімк.",
"Off": "Вимк.",
"Empty": "Порожньо",
"Linkage rule": "Правило зв'язку",
"Linkage rules": "Правила зв'язку",
"Condition": "Умова",
"Properties": "Властивості",
"Add linkage rule": "Додати правило зв'язку",
"Add property": "Додати властивість",
"Category name": "Назва категорії",
"Roles & Permissions": "Ролі та дозволи",
"Edit profile": "Редагувати профіль",
"Change password": "Змінити пароль",
"Old password": "Старий пароль",
"New password": "Новий пароль",
"Switch role": "Перемкнути роль",
"Super admin": "Суперадміністратор",
"Language": "Мова",
"Allow sign up": "Дозволити реєстрацію",
"Enable SMS authentication": "Увімкнути аутентифікацію за допомогою SMS",
"Sign out": "Вийти",
"Cancel": "Скасувати",
"Submit": "Відправити",
"Close": "Закрити",
"Set the data scope": "Встановити обсяг даних",
"Data blocks": "Блоки даних",
"Filter blocks": "Блоки фільтрів",
"Table": "Таблиця",
"Table OID(Inheritance)": "Таблиця OID (спадковість)",
"Form": "Форма",
"List": "Список",
"Grid Card": "Сітка карток",
"pixels": "пікселів",
"Screen size": "Розмір екрану",
"Display title": "Заголовок відображення",
"Set the count of columns displayed in a row": "Встановити кількість стовпців, відображених у рядку",
"Column": "Стовпець",
"Phone device": "Пристрій для телефона",
"Tablet device": "Планшетний пристрій",
"Desktop device": "Пристрій для настільного комп'ютера",
"Large screen device": "Пристрій з великим екраном",
"Collapse": "Згорнути",
"Select data source": "Вибрати джерело даних",
"Calendar": "Календар",
"Delete events": "Видалити події",
"This event": "Ця подія",
"This and following events": "Ця та наступні події",
"All events": "Усі події",
"Delete this event?": "Видалити цю подію?",
"Delete Event": "Видалити подію",
"Kanban": "Канбан",
"Gantt": "Гант",
"Create gantt block": "Створити блок Ганта",
"Progress field": "Поле прогресу",
"Time scale": "Масштаб часу",
"Hour": "Година",
"Quarter of day": "Чверть дня",
"Half of day": "Половина дня",
"Year": "Рік",
"QuarterYear": "Квартал/рік",
"Select grouping field": "Вибрати поле групування",
"Media": "Медіа",
"Markdown": "Markdown",
"Wysiwyg": "Wysiwyg",
"Chart blocks": "Блоки діаграм",
"Column chart": "Стовпчаста діаграма",
"Bar chart": "Гістограма",
"Line chart": "Лінійна діаграма",
"Pie chart": "Кругова діаграма",
"Area chart": "Площинна діаграма",
"Other chart": "Інша діаграма",
"Other blocks": "Інші блоки",
"In configuration": "У конфігурації",
"Chart title": "Заголовок діаграми",
"Chart type": "Тип діаграми",
"Chart config": "Налаштування діаграми",
"Templates": "Шаблони",
"Select template": "Вибрати шаблон",
"Action logs": "Журнал дій",
"Create template": "Створити шаблон",
"Edit markdown": "Редагувати Markdown",
"Add block": "Додати блок",
"Add new": "Додати новий",
"Add record": "Додати запис",
"Add child": "Додати дочірній",
"Collapse all": "Згорнути все",
"Expand all": "Розгорнути все",
"Expand/Collapse": "Розгорнути/згорнути",
"Default collapse": "Згорнути за замовчуванням",
"Tree table": "Деревовидна таблиця",
"Custom field display name": "Спеціальне ім'я відображення поля",
"Display fields": "Відображати поля колекції",
"Edit record": "Редагувати запис",
"Delete menu item": "Видалити пункт меню",
"Add page": "Додати сторінку",
"Add group": "Додати групу",
"Add link": "Додати посилання",
"Insert above": "Вставити вище",
"Insert below": "Вставити нижче",
"Save": "Зберегти",
"Delete block": "Видалити блок",
"Are you sure you want to delete it?": "Ви впевнені, що хочете видалити це?",
"This is a demo text, **supports Markdown syntax**.": "Це демонстраційний текст, **підтримує синтаксис Markdown**.",
"Filter": "Фільтр",
"Connect data blocks": "Підключити блоки даних",
"Action type": "Тип дії",
"Actions": "Дії",
"Insert": "Вставити",
"Update": "Оновити",
"View": "Переглянути",
"View record": "Переглянути запис",
"Refresh": "Оновити",
"Data changes": "Зміни даних",
"Field name": "Назва поля",
"Before change": "Перед зміною",
"After change": "Після зміни",
"Delete record": "Видалити запис",
"Create collection": "Створити колекцію",
"Collection display name": "Відображуване ім'я колекції",
"Collection name": "Ім'я колекції",
"Inherits": "Наслідує",
"Generate ID field automatically": "Автоматично генерувати поле ID",
"Store the creation user of each record": "Зберігати користувача, який створив кожний запис",
"Store the last update user of each record": "Зберігати користувача останнього оновлення кожного запису",
"Store the creation time of each record": "Зберігати час створення кожного запису",
"Store the last update time of each record": "Зберігати час останнього оновлення кожного запису",
"More options": "Більше опцій",
"Records can be sorted": "Записи можна сортувати",
"Calendar collection": "Календарна колекція",
"General collection": "Загальна колекція",
"Connect to database view": "Підключити до перегляду бази даних",
"Source collections": "Вихідні колекції",
"Field source": "Джерело поля",
"Preview": "Попередній перегляд",
"Randomly generated and can be modified. Support letters, numbers and underscores, must start with an letter.": "Випадково генерується і може бути змінено. Підтримує літери, цифри і підкреслення, повинно починатися з літери.",
"Storage type": "Тип зберігання",
"Edit": "Редагувати",
"Edit collection": "Редагувати колекцію",
"Configure fields": "Налаштувати поля",
"Configure columns": "Налаштувати стовпці",
"Edit field": "Редагувати поле",
"Override": "Замінити",
"Override field": "Замінити поле",
"Configure fields of {{title}}": "Налаштувати поля для {{title}}",
"Association fields filter": "Фільтр асоціативних полів",
"PK & FK fields": "PK & FK поля",
"Association fields": "Асоціативні поля",
"Choices fields": "Поля з вибором",
"System fields": "Системні поля",
"General fields": "Загальні поля",
"Inherited fields": "Успадковані поля",
"Parent collection fields": "Поля батьківської колекції",
"Basic": "Основні",
"Single line text": "Однорядковий текст",
"Long text": "Довгий текст",
"Phone": "Телефон",
"Email": "Електронна пошта",
"Number": "Число",
"Integer": "Ціле число",
"Percent": "Відсоток",
"Password": "Пароль",
"Advanced type": "Розширений",
"Formula": "Формула",
"Formula description": "Обчислення значення для кожного запису на основі інших полів у тому ж записі.",
"Choices": "Вибір",
"Checkbox": "Прапорець",
"Single select": "Одиночний вибір",
"Multiple select": "Множинний вибір",
"Radio group": "Група радіокнопок",
"Checkbox group": "Група прапорців",
"China region": "Регіон Китаю",
"Attachment": "Вкладення",
"Date & Time": "Дата та час",
"Datetime": "Дата та час",
"Relation": "Відношення",
"Link to": "Посилання на",
"Link to description": "Використовується для швидкого створення взаємозв'язків між колекціями та сумісний з найпоширенішими сценаріями. Підходить для використання не програмістами. Якщо присутнє як поле, це список випадаючого вибору, за допомогою якого вибираються записи з цільової колекції. Після створення відбувається одночасне створення пов'язаних полів поточної колекції в цільовій колекції.",
"Sub-table": "Підтаблиця",
"Sub-details": "Підрозділи",
"System info": "Системна інформація",
"Created at": "Створено о",
"Last updated at": "Останнє оновлення о",
"Created by": "Створено користувачем",
"Last updated by": "Останнє оновлення користувачем",
"Add field": "Додати поле",
"Field display name": "Відображуване ім'я поля",
"Field type": "Тип поля",
"Field interface": "Інтерфейс поля",
"Date format": "Формат дати",
"Year/Month/Day": "Рік/Місяць/День",
"Year-Month-Day": "Рік-Місяць-День",
"Day/Month/Year": "День/Місяць/Рік",
"Show time": "Показати час",
"Time format": "Формат часу",
"12 hour": "12-годинний",
"24 hour": "24-годинний",
"Relationship type": "Тип відношення",
"Inverse relationship type": "Зворотний тип відношення",
"Source collection": "Вихідна колекція",
"Source key": "Ключ вихідної колекції",
"Target collection": "Цільова колекція",
"Through collection": "Проміжна колекція",
"Target key": "Ключ цільової колекції",
"Foreign key": "Зовнішній ключ",
"One to one": "Один до одного",
"One to many": "Один до багатьох",
"Many to one": "Багато до одного",
"Many to many": "Багато до багатьох",
"Foreign key 1": "Зовнішній ключ 1",
"Foreign key 2": "Зовнішній ключ 2",
"One to one description": "Використовується для створення взаємозв'язку один до одного. Наприклад, у користувача є профіль.",
"One to many description": "Використовується для створення взаємозв'язку один до багатьох. Наприклад, у країни є багато міст, а місто може належати лише одній країні. Якщо присутнє як поле, це підтаблиця, яка відображає записи пов'язаної колекції. При створенні автоматично створюється поле 'Багато до одного' у пов'язаній колекції.",
"Many to one description": "Використовується для створення взаємозв'язку багато до одного. Наприклад, місто може належати лише одній країні, а країна може мати багато міст. Якщо присутнє як поле, це список випадаючого вибору, за допомогою якого вибирається запис з пов'язаної колекції. При створенні автоматично створюється поле 'Один до багатьох' у пов'язаній колекції.",
"Many to many description": "Використовується для створення взаємозв'язку багато до багатьох. Наприклад, у студента може бути багато викладачів, а викладач може мати багато студентів. Якщо присутнє як поле, це список випадаючого вибору, за допомогою якого вибираються записи з пов'язаної колекції.",
"Generated automatically if left blank": "Генерується автоматично, якщо залишити порожнім",
"Display association fields": "Відображати асоціативні поля",
"Display field title": "Відображати назву поля",
"Field component": "Компонент поля",
"Allow multiple": "Дозволити декілька",
"Quick upload": "Швидке завантаження",
"Select file": "Вибрати файл",
"Subtable": "Підтаблиця",
"Subform": "Підформа",
"Field mode": "Режим поля",
"Allow add new data": "Дозволити додавання нових даних",
"Record picker": "Вибір запису",
"Toggles the subfield mode": "Переключає режим підполя",
"Selector mode": "Режим селектора",
"Subtable mode": "Режим підтаблиці",
"Subform mode": "Режим підформи",
"Edit block title": "Редагувати заголовок блоку",
"Block title": "Заголовок блоку",
"Pattern": "Шаблон",
"Operator": "Оператор",
"Editable": "Редагований",
"Readonly": "Тільки для читання",
"Easy-reading": "Зручне читання",
"Add filter": "Додати фільтр",
"Add filter group": "Додати групу фільтрів",
"Comparison": "Порівняння",
"is": "є",
"is not": "не є",
"contains": "містить",
"does not contain": "не містить",
"starts with": "починається з",
"not starts with": "не починається з",
"ends with": "закінчується на",
"not ends with": "не закінчується на",
"is empty": "є порожнім",
"is not empty": "не є порожнім",
"Edit chart": "Редагувати діаграму",
"Add text": "Додати текст",
"Filterable fields": "Поля для фільтрації",
"Edit button": "Редагувати кнопку",
"Hide": "Приховати",
"Enable actions": "Увімкнути дії",
"Import": "Імпортувати",
"Export": "Експортувати",
"Customize": "Налаштувати",
"Custom": "Власний",
"Function": "Функція",
"Popup form": "Виринаюча форма",
"Flexible popup": "Гнучка виринаюча форма",
"Configure actions": "Налаштувати дії",
"Display order number": "Відображати номер порядку",
"Enable drag and drop sorting": "Увімкнути сортування перетягуванням",
"Triggered when the row is clicked": "Спрацьовує при кліці на рядок",
"Add tab": "Додати вкладку",
"Disable tabs": "Вимкнути вкладки",
"Details": "Деталі",
"Edit tab": "Редагувати вкладку",
"Relationship blocks": "Блоки відношень",
"Select record": "Вибрати запис",
"Display name": "Відображуване ім'я",
"Select icon": "Вибрати значок",
"Custom column name": "Власна назва стовпця",
"Edit description": "Редагувати опис",
"Required": "Обов'язкове",
"Unique": "Унікальне",
"Label field": "Поле мітки",
"Default is the ID field": "За замовчуванням - це поле ID",
"Set default sorting rules": "Встановити правила сортування за замовчуванням",
"Set validation rules": "Встановити правила перевірки",
"Max length": "Максимальна довжина",
"Min length": "Мінімальна довжина",
"Maximum": "Максимум",
"Minimum": "Мінімум",
"Max length must greater than min length": "Максимальна довжина повинна бути більшою за мінімальну довжину",
"Min length must less than max length": "Мінімальна довжина повинна бути меншою за максимальну довжину",
"Maximum must greater than minimum": "Максимум повинен бути більшим за мінімум",
"Minimum must less than maximum": "Мінімум повинен бути меншим за максимум",
"Validation rule": "Правило перевірки",
"Add validation rule": "Додати правило перевірки",
"Format": "Формат",
"Regular expression": "Регулярний вираз",
"Error message": "Повідомлення про помилку",
"Length": "Довжина",
"The field value cannot be greater than ": "Значення поля не може бути більше ніж ",
"The field value cannot be less than ": "Значення поля не може бути менше ніж ",
"The field value is not an integer number": "Значення поля не є цілим числом",
"Set default value": "Встановити значення за замовчуванням",
"Default value": "Значення за замовчуванням",
"is before": "перед",
"is after": "після",
"is on or after": "включно після",
"is on or before": "включно перед",
"is between": "між",
"Upload": "Завантажити",
"Select level": "Вибрати рівень",
"Province": "Область",
"City": "Місто",
"Area": "Район",
"Street": "Вулиця",
"Village": "Село",
"Must select to the last level": "Потрібно вибрати до останнього рівня",
"Move {{title}} to": "Перемістити {{title}} до",
"Target position": "Цільове положення",
"After": "Після",
"Before": "Перед",
"Add {{type}} before \"{{title}}\"": "Додати {{type}} перед \"{{title}}\"",
"Add {{type}} after \"{{title}}\"": "Додати {{type}} після \"{{title}}\"",
"Add {{type}} in \"{{title}}\"": "Додати {{type}} у \"{{title}}\"",
"Original name": "Оригінальна назва",
"Custom name": "Власна назва",
"Custom Title": "Власний заголовок",
"Options": "Опції",
"Option value": "Значення опції",
"Option label": "Позначення опції",
"Color": "Колір",
"Add option": "Додати опцію",
"Related collection": "Пов'язана колекція",
"Allow linking to multiple records": "Дозволити посилання на кілька записів",
"Allow uploading multiple files": "Дозволити завантаження кількох файлів",
"Configure calendar": "Налаштувати календар",
"Title field": "Поле заголовка",
"Custom title": "Власний заголовок",
"Daily": "Щоденно",
"Weekly": "Щотижня",
"Monthly": "Щомісяця",
"Yearly": "Щороку",
"Repeats": "Повторюється",
"Show lunar": "Показати місячний календар",
"Start date field": "Поле початкової дати",
"End date field": "Поле кінцевої дати",
"Navigate": "Навігація",
"Title": "Заголовок",
"Description": "Опис",
"Select view": "Вибрати перегляд",
"Reset": "Скинути",
"Importable fields": "Поля, які можна імпортувати",
"Exportable fields": "Поля, які можна експортувати",
"Saved successfully": "Успішно збережено",
"Nickname": "Нікнейм",
"Sign in": "Увійти",
"Sign in via account": "Увійти через обліковий запис",
"Sign in via phone": "Увійти через телефон",
"Create an account": "Створити обліковий запис",
"Sign up": "Зареєструватися",
"Confirm password": "Підтвердити пароль",
"Log in with an existing account": "Увійти з існуючим обліковим записом",
"Signed up successfully. It will jump to the login page.": "Успішно зареєстровано. Відбудеться перехід на сторінку входу.",
"Password mismatch": "Невідповідність паролів",
"Users": "Користувачі",
"Verification code": "Код перевірки",
"Send code": "Відправити код",
"Retry after {{count}} seconds": "Повторіть спробу через {{count}} секунд",
"Roles": "Ролі",
"Add role": "Додати роль",
"Role name": "Назва ролі",
"Configure": "Налаштувати",
"Configure permissions": "Налаштувати дозволи",
"Edit role": "Редагувати роль",
"Action permissions": "Дозволи дій",
"Menu permissions": "Дозволи меню",
"Menu item name": "Назва пункту меню",
"Allow access": "Дозволити доступ",
"Action name": "Назва дії",
"Allow action": "Дозволити дію",
"Action scope": "Область дії",
"Operate on new data": "Виконувати дії з новими даними",
"Operate on existing data": "Виконувати дії з існуючими даними",
"Yes": "Так",
"No": "Ні",
"Red": "Червоний",
"Magenta": "Пурпурний",
"Volcano": "Вулкан",
"Orange": "Помаранчевий",
"Gold": "Золотий",
"Lime": "Лайм",
"Green": "Зелений",
"Cyan": "Бірюзовий",
"Blue": "Синій",
"Geek blue": "Гік-синій",
"Purple": "Фіолетовий",
"Default": "За замовчуванням",
"Add card": "Додати картку",
"edit title": "редагувати назву",
"Turn pages": "Переключати сторінки",
"Others": "Інші",
"Save as template": "Зберегти як шаблон",
"Save as block template": "Зберегти як шаблон блока",
"Block templates": "Шаблони блоків",
"Convert reference to duplicate": "Конвертувати посилання на дублікат",
"Template name": "Назва шаблону",
"Block type": "Тип блока",
"No blocks to connect": "Немає блоків для підключення",
"Action column": "Стовпець дій",
"Records per page": "Записів на сторінці",
"(Fields only)": "(Тільки поля)",
"Button title": "Заголовок кнопки",
"Button icon": "Значок кнопки",
"Submitted successfully": "Успішно надіслано",
"Operation succeeded": "Операція успішна",
"Operation failed": "Операція не вдалася",
"Open mode": "Режим відкриття",
"Popup size": "Розмір спливаючого вікна",
"Small": "Малий",
"Middle": "Середній",
"Large": "Великий",
"Menu item title": "Заголовок пункту меню",
"Menu item icon": "Значок пункту меню",
"Target": "Ціль",
"Position": "Позиція",
"Insert before": "Вставити перед",
"Insert after": "Вставити після",
"UI Editor": "Редактор інтерфейсу",
"ASC": "ASC",
"DESC": "DESC",
"Add sort field": "Додати поле сортування",
"ID": "ID",
"Identifier for program usage. Support letters, numbers and underscores, must start with an letter.": "Ідентифікатор для використання в програмі. Підтримує літери, цифри і підкреслення, повинен починатися з літери.",
"Drawer": "Висувний блок",
"Dialog": "Діалогове вікно",
"Delete action": "Видалити дію",
"Custom column title": "Власний заголовок стовпця",
"Column title": "Заголовок стовпця'",
"Original title: ": "Оригінальний заголовок: ",
"Delete table column": "Видалити стовпець таблиці",
"Skip required validation": "Пропустити обов'язкову перевірку",
"Form values": "Значення форми",
"Fields values": "Значення полів",
"The field has been deleted": "Поле було видалено",
"When submitting the following fields, the saved values are": "При поданні наступних полів збережені значення:",
"After successful submission": "Після успішної подачі",
"Then": "Тоді",
"Stay on current page": "Залишитися на поточній сторінці",
"Redirect to": "Перенаправити на",
"Save action": "Зберегти дію",
"Exists": "Існує",
"Filename": "Ім'я файлу",
"Add condition": "Додати умову",
"Add condition group": "Додати групу умов",
"exists": "існує",
"not exists": "не існує",
"=": "=",
"≠": "≠",
">": ">",
"≥": "≥",
"<": "<",
"≤": "≤",
"Role UID": "UID ролі",
"Precision": "Точність",
"Formula mode": "Режим формули",
"Expression": "Вираз",
"Input +, -, *, /, ( ) to calculate, input @ to open field variables.": "Введіть +, -, *, /, ( ), щоб виконувати обчислення, введіть @, щоб відкрити змінні поля.",
"Formula error.": "Помилка формули.",
"Accept": "Прийняти",
"Rich Text": "Розширений текст",
"Junction collection": "Колекція перетину",
"Leave it blank, unless you need a custom intermediate table": "Залиште його порожнім, якщо вам не потрібна власна проміжна таблиця",
"Fields": "Поля",
"Edit field title": "Редагувати заголовок поля",
"Field title": "Заголовок поля",
"Original field title: ": "Оригінальний заголовок поля: ",
"Edit tooltip": "Редагувати підказку",
"Delete field": "Видалити поле",
"Select collection": "Вибрати колекцію",
"Blank block": "Порожній блок",
"Duplicate template": "Дублювати шаблон",
"Reference template": "Посилання на шаблон",
"Create calendar block": "Створити блок календаря",
"Create kanban block": "Створити блок канбану",
"Grouping field": "Поле для групування",
"Single select and radio fields can be used as the grouping field": "Одиночні поля вибору та поля радіокнопок можуть бути використані як поле для групування",
"Tab name": "Назва вкладки",
"Current record blocks": "Блоки поточного запису",
"Popup message": "Повідомлення у спливаючому вікні",
"Delete role": "Видалити роль",
"Role display name": "Назва ролі",
"Default role": "Роль за замовчуванням",
"All collections use general action permissions by default; permission configured individually will override the default one.": "За замовчуванням всі колекції використовують загальні права доступу до дій; індивідуально налаштовані дозволи перезапишуть загальні.",
"Allows configuration of the whole system, including UI, collections, permissions, etc.": "Дозволяє налаштування всієї системи, включаючи інтерфейс, колекції, дозволи тощо.",
"New menu items are allowed to be accessed by default.": "Новим пунктам меню дозволяється доступ за замовчуванням.",
"Global permissions": "Глобальні дозволи",
"General permissions": "Загальні дозволи",
"Global action permissions": "Глобальні дозволи на дії",
"General action permissions": "Загальні дозволи на дії",
"Plugin settings permissions": "Дозволи на налаштування плагінів",
"Allow to desgin pages": "Дозволяє створювати сторінки",
"Allow to manage plugins": "Дозволяє керувати плагінами",
"Allow to configure plugins": "Дозволяє налаштовувати плагіни",
"Allows to configure interface": "Дозволяє налаштовувати інтерфейс",
"Allows to install, activate, disable plugins": "Дозволяє встановлювати, активувати та вимикати плагіни",
"Allows to configure plugins": "Дозволяє налаштовувати плагіни",
"Action display name": "Назва дії",
"Allow": "Дозволити",
"Data scope": "Обсяг даних",
"Action on new records": "Дія для нових записів",
"Action on existing records": "Дія для існуючих записів",
"All records": "Всі записи",
"Own records": "Власні записи",
"Permission policy": "Політика дозволів",
"Individual": "Індивідуальна",
"General": "Загальна",
"Accessible": "Доступно",
"Configure permission": "Налаштувати дозвіл",
"Action permission": "Дозвіл на дію",
"Field permission": "Дозвіл на поле",
"Scope name": "Назва обсягу",
"File storages": "Сховища файлів",
"Storage display name": "Назва сховища",
"Storage name": "Назва сховища",
"Default storage": "Сховище за замовчуванням",
"Add storage": "Додати сховище",
"Edit storage": "Редагувати сховище",
"Storage base URL": "Базовий URL сховища",
"Destination": "Призначення",
"Use the built-in static file server": "Використовувати вбудований статичний файловий сервер",
"Local storage": "Локальне сховище",
"Aliyun OSS": "Aliyun OSS",
"Amazon S3": "Amazon S3",
"Tencent COS": "Tencent COS",
"Region": "Регіон",
"Bucket": "Bucket",
"Path": "Шлях",
"Unsaved changes": "Незбережені зміни",
"Are you sure you don't want to save?": "Ви впевнені, що не бажаєте зберегти?",
"Dragging": "Перетягування",
"Popup": "Спливаюче вікно",
"Trigger workflow": "Тригер робочого процесу",
"Request API": "Запит API",
"Assign field values": "Присвоїти значення полям",
"Constant value": "Константне значення",
"Dynamic value": "Динамічне значення",
"Current user": "Поточний користувач",
"Current record": "Поточний запис",
"Current time": "Поточний час",
"System variables": "Системні змінні",
"Date variables": "Змінні дати",
"Popup close method": "Метод закриття спливаючого вікна",
"Automatic close": "Автоматичне закриття",
"Manually close": "Закрити вручну",
"After successful update": "Після успішного оновлення",
"Save record": "Зберегти запис",
"Updated successfully": "Оновлено успішно",
"After successful save": "Після успішного збереження",
"After clicking the custom button, the following field values will be assigned according to the following form.": "Після натискання на власну кнопку, наступні значення полів будуть присвоєні згідно з наступною формою.",
"After clicking the custom button, the following fields of the current record will be saved according to the following form.": "Після натискання на власну кнопку, наступні поля поточного запису будуть збережені згідно з наступною формою.",
"Button background color": "Колір фону кнопки",
"Highlight": "Виділення",
"Danger red": "Небезпечний червоний",
"Custom request": "Власний запит",
"Request settings": "Налаштування запиту",
"Request URL": "URL запиту",
"Request method": "Метод запиту",
"Request query parameters": "Параметри запиту",
"Request headers": "Заголовки запиту",
"Request body": "Тіло запиту",
"Request success": "Успішний запит",
"Invalid JSON format": "Недійсний формат JSON",
"After successful request": "Після успішного запиту",
"Add exportable field": "Додати експортоване поле",
"Audit logs": "Журнал аудиту",
"Record ID": "ID запису",
"User": "Користувач",
"Field": "Поле",
"Select": "Вибрати",
"Select Field": "Вибрати поле",
"Field value changes": "Зміни значення поля",
"One to one (has one)": "Один до одного (має один)",
"One to one (belongs to)": "Один до одного (належить до)",
"Use the same time zone (GMT) for all users": "Використовувати одну і ту ж часову зону (GMT) для всіх користувачів",
"Province/city/area name": "Назва провінції/міста/району",
"Enabled languages": "Включені мови",
"View all plugins": "Переглянути всі плагіни",
"Print": "Друк",
"Done": "Готово",
"Sign up successfully, and automatically jump to the sign in page": "Успішна реєстрація, автоматичне перехід на сторінку входу",
"File manager": "Менеджер файлів",
"ACL": "ACL",
"Collection manager": "Менеджер колекцій",
"Plugin manager": "Менеджер плагінів",
"Local": "Локальний",
"Built-in": "Вбудований",
"Marketplace": "Маркетплейс",
"Coming soon...": "Скоро буде...",
"All plugin settings": "Всі налаштування плагінів",
"Bookmark": "Закладка",
"Manage all settings": "Керування всіма налаштуваннями",
"Create inverse field in the target collection": "Створити зворотнє поле у цільовій колекції",
"Inverse field name": "Назва зворотнього поля",
"Inverse field display name": "Назва відображення зворотнього поля",
"Bulk update": "Масове оновлення",
"After successful bulk update": "Після успішного масового оновлення",
"Bulk edit": "Масове редагування",
"Data will be updated": "Дані будуть оновлені",
"Selected": "Вибрані",
"All": "Всі",
"Update selected data?": "Оновити вибрані дані?",
"Update all data?": "Оновити всі дані?",
"Remains the same": "Залишається незмінним",
"Changed to": "Змінено на",
"Clear": "Очистити",
"Add attach": "Додати вкладення",
"Please select the records to be updated": "Будь ласка, виберіть записи, які потрібно оновити",
"Selector": "Селектор",
"Inner": "Внутрішній",
"Search and select collection": "Пошук та вибір колекції",
"Please fill in the iframe URL": "Будь ласка, заповніть URL-адресу iframe",
"Fix block": "Виправити блок",
"Plugin name": "Назва плагіна",
"Plugin tab name": "Назва вкладки плагіна",
"AutoGenId": "Автоматично створюване поле ID",
"CreatedBy": "Запис користувача, що створив рядок",
"UpdatedBy": "Запис користувача, що відредагував останній рядок",
"CreatedAt": "Запис часу створення рядка",
"UpdatedAt": "Запис часу останнього оновлення рядка",
"Column width": "Ширина стовпця",
"Sortable": "Сортований",
"Enable link": "Включити посилання",
"This is likely a NocoBase internals bug. Please open an issue at <1>here</1>": "Це, ймовірно, помилка внутрішніх компонентів NocoBase. Будь ласка, створіть проблему <1>тут</1>",
"Render Failed": "Помилка відображення",
"Feedback": "Зворотній зв'язок",
"Try again": "Спробуйте ще раз",
"Data template": "Шаблон даних",
"Template fields have been removed and need to be reconfigured": "Поля шаблону були видалені і потребують повторної конфігурації"
};

View File

@ -2,13 +2,14 @@ import DownloadOutlined from '@ant-design/icons/DownloadOutlined';
import { Field } from '@formily/core'; import { Field } from '@formily/core';
import { useField } from '@formily/react'; import { useField } from '@formily/react';
import { isString } from '@nocobase/utils/client'; import { isString } from '@nocobase/utils/client';
import { Button, Space } from 'antd'; import { Button, Space, Modal } from 'antd';
import cls from 'classnames'; import cls from 'classnames';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import React, { useState } from 'react'; import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
import Lightbox from 'react-image-lightbox'; import Lightbox from 'react-image-lightbox';
import { useRecord } from '../../../record-provider'; import { useRecord } from '../../../record-provider';
import { isImage, toArr, toImages } from './shared'; import { isImage, isPdf, toArr, toImages } from './shared';
import type { UploadProps } from './type'; import type { UploadProps } from './type';
type Composed = React.FC<UploadProps> & { type Composed = React.FC<UploadProps> & {
@ -19,13 +20,20 @@ type Composed = React.FC<UploadProps> & {
export const ReadPretty: Composed = () => null; export const ReadPretty: Composed = () => null;
ReadPretty.File = function File(props: UploadProps) { ReadPretty.File = function File(props: UploadProps) {
const { t } = useTranslation();
const record = useRecord(); const record = useRecord();
const field = useField<Field>(); const field = useField<Field>();
const value = isString(field.value) ? record : field.value; const value = isString(field.value) ? record : field.value;
const images = toImages(toArr(value)); const images = toImages(toArr(value));
const [photoIndex, setPhotoIndex] = useState(0); const [fileIndex, setFileIndex] = useState(0);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [fileType, setFileType] = useState<'image' | 'pdf'>();
const { size } = props; const { size } = props;
function closeIFrameModal() {
setVisible(false);
}
return ( return (
<div> <div>
<div className={cls('ant-upload-picture-card-wrapper nb-upload', size ? `nb-upload-${size}` : null)}> <div className={cls('ant-upload-picture-card-wrapper nb-upload', size ? `nb-upload-${size}` : null)}>
@ -37,7 +45,14 @@ ReadPretty.File = function File(props: UploadProps) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
setVisible(true); setVisible(true);
setPhotoIndex(index); setFileIndex(index);
setFileType('image');
} else if(isPdf(file.extname)) {
e.preventDefault();
e.stopPropagation();
setVisible(true);
setFileIndex(index);
setFileType('pdf');
} }
// else { // else {
// saveAs(file.url, `${file.title}${file.extname}`); // saveAs(file.url, `${file.title}${file.extname}`);
@ -97,21 +112,21 @@ ReadPretty.File = function File(props: UploadProps) {
})} })}
</div> </div>
</div> </div>
{visible && ( {visible && fileType === 'image' && (
<Lightbox <Lightbox
// discourageDownloads={true} // discourageDownloads={true}
mainSrc={images[photoIndex]?.imageUrl} mainSrc={images[fileIndex]?.imageUrl}
nextSrc={images[(photoIndex + 1) % images.length]?.imageUrl} nextSrc={images[(fileIndex + 1) % images.length]?.imageUrl}
prevSrc={images[(photoIndex + images.length - 1) % images.length]?.imageUrl} prevSrc={images[(fileIndex + images.length - 1) % images.length]?.imageUrl}
// @ts-ignore // @ts-ignore
onCloseRequest={(e) => { onCloseRequest={(e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
setVisible(false); setVisible(false);
}} }}
onMovePrevRequest={() => setPhotoIndex((photoIndex + images.length - 1) % images.length)} onMovePrevRequest={() => setFileIndex((fileIndex + images.length - 1) % images.length)}
onMoveNextRequest={() => setPhotoIndex((photoIndex + 1) % images.length)} onMoveNextRequest={() => setFileIndex((fileIndex + 1) % images.length)}
imageTitle={images[photoIndex]?.title} imageTitle={images[fileIndex]?.title}
toolbarButtons={[ toolbarButtons={[
<button <button
key={'download'} key={'download'}
@ -123,7 +138,7 @@ ReadPretty.File = function File(props: UploadProps) {
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
const file = images[photoIndex]; const file = images[fileIndex];
saveAs(file.url, `${file.title}${file.extname}`); saveAs(file.url, `${file.title}${file.extname}`);
}} }}
> >
@ -132,6 +147,55 @@ ReadPretty.File = function File(props: UploadProps) {
]} ]}
/> />
)} )}
{visible && fileType === 'pdf' && (
<Modal
open={visible}
title={'PDF - ' + images[fileIndex].title}
onCancel={closeIFrameModal}
footer={[
<Button
style={{
textTransform: 'capitalize'
}}
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
const file = images[fileIndex];
saveAs(file.url, `${file.title}${file.extname}`);
}}
>
{t('download')}
</Button>,
<Button onClick={closeIFrameModal} style={{textTransform: 'capitalize'}}>
{t('close')}
</Button>
]}
width={'85vw'}
centered={true}
>
<div style={{
padding: '8px',
maxWidth: '100%',
maxHeight: 'calc(100vh - 256px)',
height: '90vh',
width: '100%',
background: 'white',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
overflowY: 'auto'
}} >
<iframe src={images[fileIndex].url} style={{
width: '100%',
maxHeight: '90vh',
flex: '1 1 auto'
}}>
</iframe>
</div>
</Modal>
)}
</div> </div>
); );
}; };

View File

@ -1,7 +1,7 @@
import { DeleteOutlined, DownloadOutlined, InboxOutlined, LoadingOutlined, PlusOutlined } from '@ant-design/icons'; import { DeleteOutlined, DownloadOutlined, InboxOutlined, LoadingOutlined, PlusOutlined } from '@ant-design/icons';
import { usePrefixCls } from '@formily/antd/esm/__builtins__'; import { usePrefixCls } from '@formily/antd/esm/__builtins__';
import { connect, mapProps, mapReadPretty } from '@formily/react'; import { connect, mapProps, mapReadPretty } from '@formily/react';
import { Upload as AntdUpload, Button, Progress, Space } from 'antd'; import { Upload as AntdUpload, Button, Progress, Space, Modal } from 'antd';
import cls from 'classnames'; import cls from 'classnames';
import { css } from '@emotion/css'; import { css } from '@emotion/css';
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
@ -10,7 +10,7 @@ import { useTranslation } from 'react-i18next';
import Lightbox from 'react-image-lightbox'; import Lightbox from 'react-image-lightbox';
import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app import 'react-image-lightbox/style.css'; // This only needs to be imported once in your app
import { ReadPretty } from './ReadPretty'; import { ReadPretty } from './ReadPretty';
import { isImage, toArr, toFileList, toItem, toValue, useUploadProps } from './shared'; import { isImage, isPdf, toArr, toFileList, toItem, toValue, useUploadProps } from './shared';
import './style.less'; import './style.less';
import type { ComposedUpload, DraggerProps, DraggerV2Props, UploadProps } from './type'; import type { ComposedUpload, DraggerProps, DraggerV2Props, UploadProps } from './type';
@ -29,9 +29,13 @@ Upload.Attachment = connect((props: UploadProps) => {
const [fileList, setFileList] = useState([]); const [fileList, setFileList] = useState([]);
const [sync, setSync] = useState(true); const [sync, setSync] = useState(true);
const images = fileList; const images = fileList;
const [photoIndex, setPhotoIndex] = useState(0); const [fileIndex, setFileIndex] = useState(0);
const [visible, setVisible] = useState(false); const [visible, setVisible] = useState(false);
const [fileType, setFileType] = useState<'image' | 'pdf'>();
const { t } = useTranslation(); const { t } = useTranslation();
function closeIFrameModal() {
setVisible(false);
}
useEffect(() => { useEffect(() => {
if (sync) { if (sync) {
setFileList(toFileList(value)); setFileList(toFileList(value));
@ -48,8 +52,13 @@ Upload.Attachment = connect((props: UploadProps) => {
e.stopPropagation(); e.stopPropagation();
const index = fileList.indexOf(file); const index = fileList.indexOf(file);
if (isImage(file.extname)) { if (isImage(file.extname)) {
setFileType('image');
setVisible(true); setVisible(true);
setPhotoIndex(index); setFileIndex(index);
} else if(isPdf(file.extname)) {
setVisible(true);
setFileIndex(index);
setFileType('pdf');
} else { } else {
saveAs(file.url, `${file.title}${file.extname}`); saveAs(file.url, `${file.title}${file.extname}`);
} }
@ -161,16 +170,16 @@ Upload.Attachment = connect((props: UploadProps) => {
</div> </div>
</div> </div>
{/* 预览图片的弹框 */} {/* 预览图片的弹框 */}
{visible && ( {visible && fileType === 'image' && (
<Lightbox <Lightbox
// discourageDownloads={true} // discourageDownloads={true}
mainSrc={images[photoIndex]?.imageUrl} mainSrc={images[fileIndex]?.imageUrl}
nextSrc={images[(photoIndex + 1) % images.length]?.imageUrl} nextSrc={images[(fileIndex + 1) % images.length]?.imageUrl}
prevSrc={images[(photoIndex + images.length - 1) % images.length]?.imageUrl} prevSrc={images[(fileIndex + images.length - 1) % images.length]?.imageUrl}
onCloseRequest={() => setVisible(false)} onCloseRequest={() => setVisible(false)}
onMovePrevRequest={() => setPhotoIndex((photoIndex + images.length - 1) % images.length)} onMovePrevRequest={() => setFileIndex((fileIndex + images.length - 1) % images.length)}
onMoveNextRequest={() => setPhotoIndex((photoIndex + 1) % images.length)} onMoveNextRequest={() => setFileIndex((fileIndex + 1) % images.length)}
imageTitle={images[photoIndex]?.title} imageTitle={images[fileIndex]?.title}
toolbarButtons={[ toolbarButtons={[
<button <button
style={{ fontSize: 22, background: 'none', lineHeight: 1 }} style={{ fontSize: 22, background: 'none', lineHeight: 1 }}
@ -180,7 +189,7 @@ Upload.Attachment = connect((props: UploadProps) => {
className="ril-zoom-in ril__toolbarItemChild ril__builtinButton" className="ril-zoom-in ril__toolbarItemChild ril__builtinButton"
onClick={(e) => { onClick={(e) => {
e.preventDefault(); e.preventDefault();
const file = images[photoIndex]; const file = images[fileIndex];
saveAs(file.url, `${file.title}${file.extname}`); saveAs(file.url, `${file.title}${file.extname}`);
}} }}
> >
@ -189,6 +198,54 @@ Upload.Attachment = connect((props: UploadProps) => {
]} ]}
/> />
)} )}
{visible && fileType === 'pdf' && (
<Modal
open={visible}
title={'PDF - ' + images[fileIndex].title}
onCancel={closeIFrameModal}
footer={[
<Button
style={{
textTransform: 'capitalize'
}}
onClick={(e) => {
e.preventDefault();
e.stopPropagation();
const file = images[fileIndex];
saveAs(file.url, `${file.title}${file.extname}`);
}}
>
{t('download')}
</Button>,
<Button onClick={closeIFrameModal} style={{textTransform: 'capitalize'}}>
{t('close')}
</Button>
]}
width={'85vw'}
centered={true}
>
<div style={{
padding: '8px',
maxWidth: '100%',
maxHeight: 'calc(100vh - 256px)',
height: '90vh',
width: '100%',
background: 'white',
display: 'flex',
flexDirection: 'column',
alignItems: 'center',
overflowY: 'auto'
}} >
<iframe src={images[fileIndex].url} style={{
width: '100%',
maxHeight: '90vh',
flex: '1 1 auto'
}}>
</iframe>
</div>
</Modal>
)}
</div> </div>
); );
}, mapReadPretty(ReadPretty.File)); }, mapReadPretty(ReadPretty.File));

View File

@ -14,6 +14,10 @@ export const isImage = (extName: string) => {
return reg.test(extName); return reg.test(extName);
}; };
export const isPdf = (extName: string) => {
return extName.toLowerCase().endsWith('.pdf');
};
export const toMap = (fileList: any) => { export const toMap = (fileList: any) => {
if (!fileList) { if (!fileList) {
return []; return [];

File diff suppressed because it is too large Load Diff